XML Validator
XML Validator
当我在做uvm环境的generator脚本的时候,是通过XML来传递用户的定制参数的。比如cfg.xml的内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE top
SYSTEM "top.dtd.xml"
>
<top>
<timescale value="1ns/1ps" />
<dut name="mydut" top_file="~/mydut.v" filelist="~/mydut.f" />
<tbp name="demo" />
<env name="bus" >
<agent name="abc" active="1" off="0" >
<interface name="aa" >
<ifclk name="clk" />
<ifrst name="rst" />
<signal name="ahb_burst" bind="ahb_burst_o" />
<signal name="ahb_valid" bind="ahb_valid_o" />
</interface>
</agent>
</env>
</top>
那么如何在第一时间去check用户输入的xml信息是否是正确的?这时候就用到了DTD文件作为一种validation的标准。假设top.dtd.xml的内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- The top tag is the root tag. -->
<!ELEMENT top (timescale?,dut,tbp?,env) >
<!ELEMENT timescale EMPTY >
<!ATTLIST timescale value CDATA #REQUIRED>
<!ELEMENT dut EMPTY>
<!ATTLIST dut name CDATA #REQUIRED>
<!ATTLIST dut top_file CDATA #REQUIRED>
<!ATTLIST dut filelist CDATA #REQUIRED>
<!ELEMENT tbp EMPTY>
<!ATTLIST tbp name CDATA #REQUIRED>
<!ELEMENT env (agent+)>
<!ATTLIST env name CDATA #REQUIRED>
<!ELEMENT agent (interface)>
<!ATTLIST agent name CDATA #REQUIRED>
<!ATTLIST agent active CDATA #REQUIRED>
<!ATTLIST agent off CDATA #REQUIRED>
<!ELEMENT interface (ifclk*,ifrst*,signal+)>
<!ATTLIST interface name CDATA #REQUIRED>
<!ELEMENT ifclk EMPTY>
<!ATTLIST ifclk name CDATA #REQUIRED>
<!ELEMENT ifrst EMPTY>
<!ATTLIST ifrst name CDATA #REQUIRED>
<!ELEMENT signal EMPTY>
<!ATTLIST signal name CDATA #REQUIRED>
<!ATTLIST signal bind CDATA #IMPLIED>
我们用perl来处理XML文件的validation过程,如下:
use XML::LibXML;
my $parser = XML::LibXML->new;
$parser->validation(1);
$parser->parse_file("cfg.xml");