我正在尝试系统verilog代码,并且有一个锁存推断,这是asic流程的错误。
m_f1=m1[10]?(m1[9:1]):(m1[8:0]); e=m1[10]?(e+1):e; m_f = m_f1;
这里错误或锁存推断位于 m_f=m_f1 ,唯一使用它的其他地方是
always@(posedge clk) begin c[15]=s3; c[8:0]=m_f; c[14:9]=e; end
正如评论中@dave_59 所指出的,锁存器推断来自于该多路复用器的反馈
e =m1[10] ? (e + 1) :e ;
其示意图如下所示:
很明显,这是围绕组合逻辑(多路复用器,又名多路复用器)的反馈,也称为锁存器。
可以使用多路复用器在
e
e + 1
您可以在反馈路径中放置一个寄存器(如果这是您想要的行为),并且有关锁存器的警告将会消失。有时累加器或累加器看起来像多路复用器周围的反馈,但是您需要一个寄存器来正确建模累加器。
与寄存器相同的电路可能如下所示:
这将允许您加载 e,然后使用 select m1[10] 添加 1。