合成不支持多个单边下的分配,将其更改为警告

时间:2015-11-06 19:27:40

标签: cpu verilog

我的代码如下,以verilog编写 问题是,我想在一个始终块中更改一个名为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

2 个答案:

答案 0 :(得分:0)

您在敏感度列表中不需要posedge PC_SRC or posedge PC_Jmp。只需保留@posedge clk并将所有分配放在第一个开始结束块内的PC中。

@posedge被合成为需要时钟的翻转翻转。有三个@posedge意味着一个对三个不同时钟敏感的翻牌,你的综合工具不支持。

答案 1 :(得分:0)

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

要合成,reg只能在一个总块内分配。

应使用非阻止分配(<=)进行同步分配,而不是阻止分配(=)。在组合块中使用阻塞分配(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