verilog - 更改为自动时钟会导致输出变为空白
问题描述
尝试在测试台中自动化延迟触发器的时钟,因为我不想总是像这样手动执行它:
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
and$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
.
推荐阅读
- python - Nan的单元测试检查
- amazon-sqs - 有没有办法从标准 SQS 队列中接收大多数消息?[非先进先出]
- javascript - 未选择选择元素中的第二个选项时禁用按钮
- ruby - Ruby:在 Struct 中定义常量的语法
- android - BroadcastReceiver 没有收到广播事件消息
- r - 19 位数字不会像在 R 中那样被解析
- python - 如何在python中的某个单词之后提取字符串?
- python - 试图使它成为您可以从列表中选择书籍的地方,然后在最后使用 python 给出分项收据
- r - ggplot 清理堆积条形图上的 y 轴
- http - multipart/form-data 是一次性还是以流的形式发送整个文件数据