从Shell传递变量给verilog的两种方法

从Shell传递变量给verilog的两种方法

  • 通过define宏传递

    首先在命令行中定义define

    1
    2
    3
    4
    5
    6
    7
    vcs -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
    3
    def 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, +DUMPWAVETESTCASE

    1
    2
    3
    4
    run: 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
15
reg [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

评论