verilog \$test\$plusargs的使用

1. 作用

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

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);

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
posted @ 2022-01-29 11:14  编程驴子  阅读(459)  评论(0编辑  收藏  举报