Я пытаюсь реализовать проект 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.
initial
(т.е.load <= 0
, а неload = 0
, относитесь к нему как к выходу из другого где-нибудь зарегистрируйтесь), порядок симуляции различных блоков в вашем дизайне (always
в DFF,assign
в Mux иalways
блок синхронизации иinitial
блок стимула) имеет значение. Т.е., когда обновления из блокаinitial
происходят, не происходят, когда вы этого хотите, из-за назначения блокировки. - person Unn   schedule 17.08.2015always @(posedge clk) begin q <= data; end
. Как указал Унн, вашиdata
иload
стимулы должны быть неблокирующими, чтобы они не вызывали состояние гонки с часами. В качестве альтернативы можно добавить небольшую задержку для одновременного воспроизведения. Точка, являющаяся новыми значениями стимулов, должна быть обновлена по истечении времени. - person Greg   schedule 17.08.2015