【问题标题】:assignment under multiple single edges is not supported for synthesis , change it to warning综合不支持多个单边下的分配,将其更改为警告
【发布时间】:2015-11-07 06:22:36
【问题描述】:

我有下面的代码,它是用 verilog 编写的。
问题是,我想在 always 块中更改名为 PC 的 reg 我需要在多个 Always Block 中处理这个问题。如果我这样做,我会收到多个驱动器错误,这是有道理的。
所以我尝试在敏感度列表中添加一些其他变量 但我收到此错误:

合成不支持在多个单边下分配。

我无法更改代码的结构。 请给我一个解决方案 代码:

always@( posedge clk or posedge PC_SRC or posedge PC_Jmp)
begin
        if( clk == 1   )
        begin
            PC = PC + 1 ; 
        end

        if(  PC_SRC == 1  )
        begin
            PC = PC + Branch_PC ; 
        end

        if( PC_Jmp == 1)
        begin
            PC = Branch_PC ;  
        end
end

【问题讨论】:

    标签: cpu verilog


    【解决方案1】:

    通过同步设计,您可以拥有一个边沿触发的时钟信号。根据您的综合库,一个或两个异步控制引脚(posedge 映射到高电平有效,negedge 映射到低电平有效)。异步控制引脚由合成器通过在 always 块中使用来识别,并可用于将变量分配给常量。请注意,永远不要在 always 块中引用同步时钟信号。

    为了便于综合,reg 只能在一个 always 块内分配。

    应使用非阻塞分配 (<=) 进行同步分配,而不是阻塞分配 (=)。在组合块中使用阻塞分配 (always @*)。使用适当的分配类型将防止 RTL 模拟竞态条件和模拟 RTL-vs-gate 行为差异。

    您的代码应如下所示:

    always @( posedge clk )
    begin
        if ( PC_Jmp == 1 )
        begin
            PC <= Branch_PC ;  
        end
        else if ( PC_SRC == 1 )
        begin
            PC <= PC + Branch_PC ; 
        end
        else
        begin
            PC <= PC + 1 ; 
        end
    end
    

    【讨论】:

      【解决方案2】:

      您不需要敏感列表中的posedge PC_SRC or posedge PC_Jmp。只需保留@posedge clk 并将所有分配给PC 放在第一个begin-end 块中。

      @posedge 被合成为一个需要时钟的触发器。拥有三个@posedge 意味着触发器对三个不同的时钟敏感,您的综合工具不支持。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 2015-11-29
        • 2015-10-02
        相关资源
        最近更新 更多