尝试自动在测试台中为Delay Flip Flop设置时钟,因为我不希望总是这样手动进行操作:
clock = 0
#5 clock = 1
#10 clock = 0
但是突然之间,我的代码(下面)不起作用。
module d_flip_flop
(
input [bit:0] a,
input clock,
output reg [bit:0] out
);
parameter bit = 4 - 1;
always @(posedge clock)
begin
out = a;
end
endmodule
试验台
module d_flip_flop_tb;
reg [bit:0] a;
reg clock;
wire [bit:0] out;
parameter bit = 4 - 1;
d_flip_flop FLIP1
(
a,
clock,
out
);
initial
begin
clock = 0;
forever
begin
#5 clock = ~clock;
end
#1 assign a = 4'b0000;
$display("INPUT | %b", a);
$monitor("OUTPUT | %b", out);
#15 assign a = 4'b1111;
end
endmodule
输出似乎是空白的,所以我不知道要更改什么而不输出任何错误(使用Icarus v10)。另外,当我手动滴答时钟时,它工作正常。
主要问题是forever
循环会阻止$display
和$monitor
代码执行。您应该将时钟分成单独的initial
块。我还添加了一条$finish
语句以明确终止模拟。
我不得不将您的parameter
声明移到它们的用法之上,因为在不同的模拟器上您的代码出现编译错误。
module d_flip_flop
#( parameter bit = 4 - 1)
(
input [bit:0] a,
input clock,
output reg [bit:0] out
);
always @(posedge clock)
begin
out = a;
end
endmodule
module d_flip_flop_tb;
parameter bit = 4 - 1;
reg [bit:0] a;
reg clock;
wire [bit:0] out;
d_flip_flop FLIP1
(
a,
clock,
out
);
initial begin
clock = 0;
forever
begin
#5 clock = ~clock;
end
end
initial begin
#1 a = 4'b0000;
$display("INPUT | %b", a);
$monitor("OUTPUT | %b", out);
#15 a = 4'b1111;
#100 $finish;
end
endmodule
现在,我看到输出更改:
INPUT | 0000
OUTPUT | xxxx
OUTPUT | 0000
OUTPUT | 1111
其他说明:
您不应该assign
在initial
块内使用。
bit
是SystemVerilog的保留关键字。一旦iverilog
支持该语法,您可能会遇到编译错误。您可以更改bit
为类似的常规内容WIDTH
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句