В начальных блоках измените свои NBA на BA. NBA следует использовать только в пределах always @(posedge clocksignal) block
. Также учтите, что в симуляциях блоки @(posedge clocksignal)
(без зарезервированного слова always
) обрабатываются как задержки (подождите, пока не произойдет событие clk нарастающего фронта. , затем продолжите моделирование). Кстати, вы записали эти блоки в своих начальных утверждениях, я не знал наверняка, знали ли вы об их истинном поведении. Я переписал эти @(posedge)
блоки, чтобы сделать поток симуляции немного яснее.
Я также объединил некоторые из ваших начальных блоков в один. Каждый начальный блок у вас запускается одновременно (время моделирования 0). В частности, write_clk_init
назначается в двух разных начальных блоках.
Этот отредактированный код работает должным образом. Он также доступен по адресу https://www.edaplayground.com/x/3VYk
module tb;
reg [4:0] data_in;
reg write_clk;
reg write_clk_en;
reg write_clk_mod;
reg [5:0] write_clk_init;
initial begin
$dumpfile("dump.vcd");
$dumpvars;
#10000 $finish;
end
initial begin
data_in = 5'b00000;
write_clk_init = 6'b110111;
write_clk_mod = 0;
write_clk = 0;
repeat (3) begin
@(posedge write_clk);
if(write_clk_init[0]==1 || write_clk_init[0]==0)
write_clk_mod = write_clk_init[0];
@(posedge write_clk);
if(write_clk_init[1]==1 || write_clk_init[1]==0)
write_clk_mod = write_clk_init[1];
@(posedge write_clk);
if(write_clk_init[2]==1 || write_clk_init[2]==0)
write_clk_mod = write_clk_init[2];
@(posedge write_clk);
if(write_clk_init[3]==1 || write_clk_init[3]==0)
write_clk_mod = write_clk_init[3];
@(posedge write_clk);
if(write_clk_init[4]==1 || write_clk_init[4]==0)
write_clk_mod = write_clk_init[4];
@(posedge write_clk);
if(write_clk_init[5]==1 || write_clk_init[5]==0)
write_clk_mod = write_clk_init[5];
end
end
always @* begin
write_clk_en = write_clk & write_clk_mod;
end
initial begin
@(posedge write_clk_en);
data_in[0] = 1'b1;
@(posedge write_clk_en);
data_in[1] = 1'b1;
@(posedge write_clk_en);
data_in[2] = 1'b1;
@(posedge write_clk_en);
data_in[3] = 1'b1;
@(posedge write_clk_en);
data_in[4] = 1'b1;
end
always begin
write_clk = #10 ~write_clk;
end
endmodule