【发布时间】:2015-02-22 03:13:20
【问题描述】:
我知道我应该在顺序总是分配中使用非阻塞分配。但是,我不小心在我的部分代码中使用了阻塞赋值,这里是:
reg tb_strobe = 0;
reg [9:0] tb_strobe_cnt = 0;
reg tb_sync = 0;
always@(posedge tb_clkh)
begin
if (~tb_resetl) begin
tb_strobe <= 0;
tb_strobe_cnt <= 0;
tb_sync <= 0;
end
else begin
if (tb_strobe_cnt == 1022) begin
tb_strobe <= 1;
tb_strobe_cnt <= tb_strobe_cnt + 1;
end else if (tb_strobe_cnt == 1023) begin
tb_strobe <= 0;
tb_strobe_cnt <= 0;
end else begin
tb_strobe <= 0;
tb_strobe_cnt <= tb_strobe_cnt + 1;
end
if (tb_strobe == 1) begin
tb_sync = 1; // <-- this is the mistakenly used blocking assignment
end else begin
end
end
end
然后我的模拟器的行为无法预测,一旦我将该分配固定为非阻塞分配,它就开始正常工作了!!!
我很好奇上面(在我的特定代码中)有什么问题? 以我使用它的方式,由于我只在代码中调用 tb_sync 一次,我没想到会有任何不可预知的行为...... 并且 tb_sync 没有被分配到代码中的其他任何地方。知道有什么问题吗?
【问题讨论】: