verilog \$test\$plusargs和\$value\$plusargs的使用

1. $test$plusargs

1.1 作用

$test$plusargs是verilog在仿真运行时调用的系统函数, 可以根据仿真选项不同, 创建不同的运行分支.

1.2 举例

module tb;

logic clk;

initial begin
    #0 clk = 0;

    forever begin
        #5 clk = ~clk;
    end
end

initial begin
    #500 $finish;
end

reg a0, a1;
reg b0, b1;

always@(posedge clk)begin
    if(! $test$plusargs("DEL_A"))begin
        a0 = 1'b0;
        a1 = 1'b1;
    end

    if(! $test$plusargs("DEL_B"))begin
        b0 = 1'b0;
        b1 = 1'b1;
    end
end

endmodule

编译后, 根据选项不同, 进行不同的仿真:

simv               # 没有设置DEL_A和DEL_B, 会把a0/a1/b0/b1都初始化;
simv +DEL_A        # 设置了DEL_A, a0/a1不初始化(都是x), b0/b1初始化.
simv +DEL_A +DEL_B # 设置了DEL_A和DEL_B, a0/a1/b0/b1都不初始化(都是x);

1.3 与宏定义的区别

使用宏定义也可以达到上述目的.
但使用宏定义的缺点是: 修改DEL_A和DEL_B的设置时, 需要重新编译, 直接修改simv参数无效.

module tb;

logic clk;

initial begin
    #0 clk = 0;

    forever begin
        #5 clk = ~clk;
    end
end

initial begin
    #500 $finish;
end

reg a0, a1;
reg b0, b1;

always@(posedge clk)begin
    `ifndef DEL_A
        a0 = 1'b0;
        a1 = 1'b1;
    `endif

    `ifndef DEL_B
        b0 = 1'b0;
        b1 = 1'b1;
    `endif
end

endmodule

2. $value$plusargs

2.1 作用

$value$plusargs是verilog在仿真运行时调用的系统函数, 可以根据仿真选项不同, 传入不同的value.

2.2 举例

一个给mem注错的例子

    reg [74:0] mem_fault_array_xor [2047:0];

    integer i, err_word, err_bit;

    initial begin
        #初始化为0
        for (i=0;i<2048;i=i+1>) begin
            mem_fault_array_xor[i] = 75'b0;
        end

        #给指定的行列注错
        #一个值与1异或, 相当于取反, A^1=A*0 + ~A*1 = ~A;
        #   把仿真选项中的ERR_WORD值传给err_word
        #   把仿真选项中的ERR_bit值传给err_bit
        if ($value$plusargs("ERR_WORD=%d", err_word)) begin
            if ($value$plusargs("ERR_BIT=%d", err_bit)) begin
                mem_fault_array_xor[err_word] = 1'b1<<err_bit;
            end
            else begin
                mem_fault_array_xor[err_word] = 1'b1<<2;
            end
        end

    end

    reg [74:0] read_data;
    always@(*)begin
        #一个值与1异或, 相当于取反, A^1=A*0 + ~A*1 = ~A;
        read_data[74:0] = mem[addr][74:0] ^ mem_fault_array_xor[addr][74:0];
    end

编译后, 根据选项不同, 对不同的位置注错:

simv                             # 没有设置ERR_WORD和ERR_BIT, mem中没有fault;
simv +ERR_WORD=1024              # 设置了ERR_WORD, 没有ERR_BIT, 对addr=1024, bit=2注错.
simv +ERR_WORD=1024 +ERR_BIT=10  # 设置了ERR_WORD和ERR_BIT, 对addr=1024, bit=10注错.
posted @ 2022-01-29 11:14  编程驴子  阅读(483)  评论(0编辑  收藏  举报