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注错.