Verilog转VHDL代码报错求助:多时钟边沿致寄存器无法推断
错误原因与修复方案
原Verilog代码功能解析
这段Verilog实现的是一个异步低电平复位的寄存器:
- 当复位信号
iRST为低电平时(!iRST),立即将go_en置0 - 复位无效时,在
iGO的上升沿触发,将go_en置1
错误的VHDL代码问题点
- 逻辑结构混乱:错误地把
falling_edge(iRST)作为外层判断,同时内部重复检查iRST='0',让综合器无法识别正确的异步复位逻辑 - 多时钟误判:在复位分支内嵌套
rising_edge(iGO)的判断,导致综合器认为iRST和iGO都是时钟信号,违反单时钟寄存器的实现规范 - Latch推断:当复位无效且
iGO无上升沿时,go_en没有赋值,综合器会推断出不必要的Latch
修复后的VHDL代码
process (iRST, iGO) begin if iRST = '0' then -- 异步低电平复位,直接判断电平而非边沿 go_en <= '0'; elsif rising_edge(iGO) then -- 复位无效时,响应iGO的上升沿 go_en <= '1'; end if; end process;
修复说明
- 敏感列表包含
iRST和iGO:异步复位需要将复位信号加入敏感列表,确保复位生效时立即触发逻辑 - 复位逻辑优先级最高:直接通过电平判断(
iRST='0')实现异步复位,而非边沿检测 - 逻辑分支全覆盖:复位分支之外仅在
iGO上升沿更新寄存器值,避免综合器推断Latch
内容的提问来源于stack exchange,提问作者Engineer
相关产品推荐
相关产品推荐

