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

时间:2015-05-10 11:21:03

标签: verilog synthesis

我写了这段代码:

module Key_Schedule(
    subkey_tupple1,
    subkey_tupple2,
    generate_key_final_step,
    rst,clk
);

    reg [0:31] a1,b1,a2,b2;
    input [0:31] subkey_tupple1;
    input [0:31] subkey_tupple2;
    //input [31:0] subkey_A_swap;
    //input [31:0] subkey_B_swap;
    input clk,rst;
    output reg [0:63] generate_key_final_step;
    reg [0:63] temp;
    reg [0:63] round_sub_key_left;

    always @(posedge clk or negedge rst)
    begin
        if (!rst)
        begin
            temp<={64{1'b0}};
            round_sub_key_left<={64{1'b0}};
        end
        else
            temp<={subkey_tupple1[0:31],subkey_tupple2[0:31]};

//The error is below... line 49
        round_sub_key_left<={temp[8:15],temp[16:23],temp[24:31],temp[0:7],temp[40:47],temp[48:55],temp[56:63],temp[32:39]};
        a1={temp[8:15],temp[16:23],temp[24:31],temp[0:7]};
        b1={temp[40:47],temp[48:55],temp[56:63],temp[32:39]};
        a2=b1;
        b2=a1^b1;
        generate_key_final_step={a2,b2};
    end
endmodule

当我单击Synthesize -XST时出现此错误:

  

错误:HDLC编译器:1128 - &#34; D:\ Embedded_Project \ Key_Schedule.v&#34;第49行:合成不支持多个单边下的分配

2 个答案:

答案 0 :(得分:2)

begin条件周围缺少end - else。因此,temp的分配是else条件中唯一的分配。处于有效重置状态round_sub_key_left仍然来自temp。在异步重置round_sub_key_left期间没有分配给常量这一事实就是错误。

另外,在工具上提到:将组合逻辑和同步逻辑放在同一个总块中通常是一种不好的做法(即混合阻塞和非阻塞分配)。最佳实践是将组合逻辑放在带有阻塞分配的always @*块中(=)。同步逻辑(即触发器)应该放在always @(posedge clk /*+ async-set/set*/)中,并且只使用非阻塞分配(<=)。

always @(posedge clk or negedge rst) begin
  if (!rst) begin
    temp<={64{1'b0}};
    round_sub_key_left<={64{1'b0}};
  end
  else begin
    temp <= {subkey_tupple1[0:31],subkey_tupple2[0:31]};
    round_sub_key_left <= temp[8:31],temp[0:7],temp[40:63],temp[32:39]};
  end
end
always @* begin : output_comb_logic
    a1={temp[8:15],temp[16:23],temp[24:31],temp[0:7]};
    b1={temp[40:47],temp[48:55],temp[56:63],temp[32:39]};
    a2=b1;
    b2=a1^b1;
    generate_key_final_step={a2,b2};
end

答案 1 :(得分:1)

第47行的

else仅影响一行,而且不正确。 在reset条件下round_sub_key_left有两个相互冲突的驱动因素。 将else后面的代码放在begin-end括号中。