【发布时间】:2017-06-30 12:58:33
【问题描述】:
我遇到了一个奇怪的问题。该代码用于一个简单的 ALU。此处仅粘贴感兴趣的代码:
always @(posedge clk or posedge rst)
begin
if (rst == 1) begin
mul_valid_shr = 3'b000;
end else begin
if (op_mul_i == 1) begin
mul_valid_shr = 3'b111;
end else begin
mul_valid_shr <= mul_valid_shr << 1;
end
end
end
在always块之外:
assign mul_valid = mul_valid_shr[2];
使用我的测试台进行 POST SYNTHESIS FUNCTIONAL SIMULATION 的结果如下:
reset 已经很低了,为什么第一次 sim 不行,第二次和第三次都正常?如果我在 100ns 标记之前触发op_mul_i,即使rst 很低,即使mul_result 第一次停止工作。
欢迎任何猜测。
更新:此处为完整代码:https://www.edaplayground.com/x/28Hx
【问题讨论】:
-
我怀疑这不是您的问题的原因,但切勿在时钟始终块中混合阻塞和非阻塞分配到同一个变量。通常,您希望对任何暗示触发器的变量使用非阻塞赋值。我很惊讶你的合成器允许你这样做。因此,
mul_valid_shr(mul_valid_shr = 3'b...) 的两个阻塞分配应该是非阻塞的 (mul_valid_shr <= 3'b...)。 -
我已经尝试过这个并且对所有事情都使用了非阻塞。它仍然具有完全相同的结果。
-
我认为这不会有帮助。但是不要把它们混在一起。
-
是的,刚刚改了。
-
它在
pre-synthesis 模拟中有效吗?我还认为您在示例中遗漏了一些重要的 rtl 部分。
标签: verilog hdl synthesis vivado