DFF в verilog с задержкой
Я пытаюсь реализовать проект nand2tetris в verilog и бью стену с помощью icarus verilog. В книге они реализуют 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 Verilog или 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);
endmodule
Icarus 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.
1 ответ
Спасибо Ууну и Грегу, вот как я исправил проблему. Код находится на 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
end module