通过define宏传递
首先在命令行中定义define
1
2
3
4
5
6
7vcs -sverilog -debug_all +define%s+CASENAME=\"%s\"
-timescale=1ns/100ps
+notimingcheck
+nospecify +v2k +memcbk
-fsdb
-l com.log
-f top.f尤其要注意
CASENAME=\"%s\"
的转义“\”的应用,比如命令行被包含在python脚本内部,需要两次转义, 而shell可能只要一次1
2
3def run(case,defines=""):
os.system('vcs -sverilog -debug_all +define%s+CASENAME=\\"%s\\" -timescale=1ns/100ps +notimingcheck +nospecify +v2k +memcbk -fsdb -l com.log -f top.f'%(defines,case))
os.system('./simv -l sim.log +notimingcheck +nospecify +loopreport +memcbk +novopt')否则verilog文件是无法获取CASENAM的意思
然后在verilog中通过宏取出
1
fp_reg = $fopen({"./case/",`CASENAME,"/source_dpp.txt"},"r");
这种方式比较繁琐,而且转义嵌套难以理解,另外一种方便的方法如下
通过option arg传递
首先在命令行的option里定义两个puls类型的args,
+DUMPWAVE
和TESTCASE
1
2
3
4run: compile
rm -rf ${TEST_RUNDIR}
mkdir ${TEST_RUNDIR}
cd ${TEST_RUNDIR}; ${SIM_EXEC} +DUMPWAVE=${DUMPWAVE} +TESTCASE=${TESTCASE} |& tee ${TESTNAME}.log; cd ${RUN_DIR};
然后在verilog文件中通过$val$plusargs()
获取val
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15reg [8*300:1] testcase;
integer dumpwave;
initial begin
if($value$plusargs("TESTCASE=%s",testcase))begin
$display("TESTCASE=%s",testcase);
end
initial begin
$value$plusargs("DUMPWAVE=%d",dumpwave);
if(dumpwave != 0)begin
// To add your waveform generation function
$fsdbDumpfile("./e203.fsdb") ;
$fsdbDumpvars(0,tb_top);
$fsdbDumpflush;
end
end