更改为自动时钟会导致输出变为空白
Changing to automatic clock causes output to go blank
正在尝试在测试台中自动执行延迟触发器的时钟,因为我不想总是像这样手动执行它:
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
其他说明:
你不应该在 initial
块中使用 assign
。
bit
是 SystemVerilog 的保留关键字。一旦 iverilog
支持该语法,您可能会遇到编译错误。您可以将 bit
更改为常规的内容,例如 WIDTH
.
正在尝试在测试台中自动执行延迟触发器的时钟,因为我不想总是像这样手动执行它:
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
其他说明:
你不应该在 initial
块中使用 assign
。
bit
是 SystemVerilog 的保留关键字。一旦 iverilog
支持该语法,您可能会遇到编译错误。您可以将 bit
更改为常规的内容,例如 WIDTH
.