我正试图在verilog中实现nand2tetris项目,并且正在使用伊卡洛斯来解决问题。在书中,他们实现了这样的DFF,q(t) = d(t-1)。当前时间的输出是上一个posedge clk的输入。这是我意识到的DFF。
module Dff (
output reg q,
input data, clk
);
reg p;
reg o;
always @(posedge clk) begin
o <= data;
q <= p;
end
always @(negedge clk) begin
p <= o;
end
endmodule当我直接测试这个DFF时,它似乎工作得很好。但是当我重用它来创建一个内存单元时,它会变得疯狂。有趣的是,使用Icarus或EDAPlayground (使用VCS)的疯狂是不同的。
module Mux (out, a, b, sel);
input a, b;
input sel;
output reg out;
assign out = ~sel ? a : b;
endmodule
module Bit (
output out,
input data, load, clk
);
Mux m0(in, out, data, load);
Dff d0(out, in, clk);
endmoduleIcarus Verilog输出
data | load | clk | out
------+------+-----+-----
0 | 1 | 1 | x
0 | 1 | 0 | x
1 | 1 | 1 | x
1 | 1 | 0 | x
0 | 1 | 1 | 1
0 | 1 | 0 | 1
0 | 0 | 1 | 0
0 | 0 | 0 | 0
1 | 1 | 1 | 0
1 | 1 | 0 | 0
0 | 0 | 1 | 0 # !?!?!
0 | 0 | 0 | 0 # it should be 1 here.EDAPlayground输出
data | load | clk | out
------+------+-----+-----
0 | 1 | 1 | x
0 | 1 | 0 | x
1 | 1 | 1 | x
1 | 1 | 0 | x
0 | 1 | 1 | 1
0 | 1 | 0 | 1
0 | 0 | 1 | 0
0 | 0 | 0 | 0
1 | 1 | 1 | 1 # !?!?!
1 | 1 | 0 | 1 # it should be 0 here.
0 | 0 | 1 | 1
0 | 0 | 0 | 1该代码在EDAPlayground上是可测试的。
发布于 2015-08-20 10:54:28
感谢Uun和Greg,我是如何解决这个问题的。The 密码在EDA操场上
一个DFF可以更简单。
module Dff (
output reg q,
input data, clk
);
always @(posedge clk) begin
q <= data;
end
endmodule那么测试就是罪魁祸首。阻塞作业会造成混乱。修复这一问题的一个简单方法是通过<=更改所有<=,如下所示:
module Bit_tb;
reg clk = 0;
reg data = 0;
reg load = 1;
wire out;
initial begin
#2
data <= 1;
#2
load <= 0; // load = 0; /!\ would be blocking before
data <= 0; // data = 0; doing this line. /!\
#2
$finish;
end
endmodulehttps://stackoverflow.com/questions/32047033
复制相似问题