我写了这段代码:
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行:合成不支持多个单边下的分配
答案 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)
else
仅影响一行,而且不正确。
在reset
条件下round_sub_key_left
有两个相互冲突的驱动因素。
将else
后面的代码放在begin-end
括号中。