我一直在尝试在Verilog中实现全加法器。我已经实现了它,它也在Isim上显示结果。唯一的问题是,当我尝试使用$ monitor命令查看模拟时,它只显示1个结果,而不是所有模拟结果。这是testbench代码:
module Full_adder_s2_testbench;
// Inputs
reg a;
reg b;
reg cin;
// Outputs
wire sum;
wire cout;
// Instantiate the Unit Under Test (UUT)
Full_adder_s2 uut (
.a(a),
.b(b),
.cin(cin),
.sum(sum),
.cout(cout)
);
integer i;
initial begin
// Initialize Inputs
a = 0;
b = 0;
cin = 0;
// Wait 100 ns for global reset to finish
#100;
end
always @ ( a, b, cin )
begin
// generate truth table
for ( i = 0; i < 8; i = i + 1 )
// every 10 ns set a, b, and cin to the binary rep. of i
#10 {a, b, cin} = i;
$monitor( "%d ns: a + b + cin = %b + %b + %b = cout sum = %b %b",
$time, a, b, cin, cout, sum );
// stop 10ns after last change of inputs
#10 $stop;
end
endmodule
这是ISIM的结果:
模拟器正在进行电路初始化过程。
完成电路初始化过程。
400 ns: a + b + cin = 1 + 1 + 1 = cout sum = 1 1
时间停止:410 ns:在文件“E:/ Namal / FYP /我的工作/ XILINX / Full_adder_s2 / Full_adder_s2_testbench.v”第66行
答案 0 :(得分:2)
$monitor
只需设置一次,每次信号发生变化时都会触发,请尝试使用$display
,因为您已经在always @*
内有声明。
在学习Verilog时,我鼓励你自由地使用begin end
。问题是for循环只有1行,$display
/ $monitor
在外面,因此只在开始时执行一次。
always @* begin
// generate truth table
for ( i = 0; i < 8; i = i + 1 ) begin //<-- Added begin
// every 10 ns set a, b, and cin to the binary rep. of i
#10 {a, b, cin} = i;
$display( "%d ns: a + b + cin = %b + %b + %b = cout sum = %b %b", $time, a, b, cin, cout, sum );
end //<--Added end
// stop 10ns after last input
#10 $stop;
端
EDA Playground上的完整示例。
注意:最好不再使用手动敏感度列表,将always @ ( a, b, cin )
替换为always @*
。这将导致更快的重构并降低RTL与门模拟不匹配的可能性。