无需在 verilog 中始终手动输入测试台的备用信号
Alternate signals for test bench without manually typing out all times in iverilog
我正在编写一个测试台,我希望能够让信号以某种模式(类似这样)变高和变低:
目前我每次手动输入我想要的是这样的:
module TestExample;
reg a, b, c;
initial begin
$dumpfile("test.vcd");
$dumpvars(0, TestExample);
# 0 a=0; b=0; c=0;
# 10 a=1; b=0; c=0;
# 20 a=0; b=1; c=0;
# 30 a=1; b=1; c=0;
# 40 a=0; b=0; c=1;
# 50 a=1; b=0; c=1;
# 60 a=0; b=1; c=1;
# 70 a=1; b=1; c=1;
# 80 a=0; b=0; c=0;
# 90 $stop;
end
endmodule
问题是当我收到更多信号时(假设是 a-z 而不是 a-b),每次手动输入相关值将花费很长时间。因此,我想知道是否有一种方法可以使信号自动化。例如,如果我可以说对于 a 每 10 u 秒切换一次状态,对于 b 每 20 u 秒切换一次,对于 c 每 30 u 秒切换一次?
正如格雷格所说...
module TestExample;
wire a, b, c, d ...
integer i;
initial begin
$dumpfile("test.vcd");
$dumpvars(0, TestExample);
for (i = 0; i < 1<<26; i=i+1)
#10;
$stop;
end
assign a = i[0], b = i[1], c = i[2], d = i[3] ...
endmodule
对于通用模式,您可以使用多个初始块,比如每个变量一个:
initial begin
a = 0;
forever begin
#10 a = 1;
#10 a = 0;
end
end
initial
b = 1;
forever begin
#30 b = 0;
#30 b = 1;
end
end
...
initial begin
$dumpfile("test.vcd");
$dumpvars(0, TestExample);
#1000 $finish;
end
我正在编写一个测试台,我希望能够让信号以某种模式(类似这样)变高和变低:
module TestExample;
reg a, b, c;
initial begin
$dumpfile("test.vcd");
$dumpvars(0, TestExample);
# 0 a=0; b=0; c=0;
# 10 a=1; b=0; c=0;
# 20 a=0; b=1; c=0;
# 30 a=1; b=1; c=0;
# 40 a=0; b=0; c=1;
# 50 a=1; b=0; c=1;
# 60 a=0; b=1; c=1;
# 70 a=1; b=1; c=1;
# 80 a=0; b=0; c=0;
# 90 $stop;
end
endmodule
问题是当我收到更多信号时(假设是 a-z 而不是 a-b),每次手动输入相关值将花费很长时间。因此,我想知道是否有一种方法可以使信号自动化。例如,如果我可以说对于 a 每 10 u 秒切换一次状态,对于 b 每 20 u 秒切换一次,对于 c 每 30 u 秒切换一次?
正如格雷格所说...
module TestExample;
wire a, b, c, d ...
integer i;
initial begin
$dumpfile("test.vcd");
$dumpvars(0, TestExample);
for (i = 0; i < 1<<26; i=i+1)
#10;
$stop;
end
assign a = i[0], b = i[1], c = i[2], d = i[3] ...
endmodule
对于通用模式,您可以使用多个初始块,比如每个变量一个:
initial begin
a = 0;
forever begin
#10 a = 1;
#10 a = 0;
end
end
initial
b = 1;
forever begin
#30 b = 0;
#30 b = 1;
end
end
...
initial begin
$dumpfile("test.vcd");
$dumpvars(0, TestExample);
#1000 $finish;
end