我在同一个模块中使用两个始终块。它会导致合成代码出错吗?源代码是在下面给出的Verilog中编写的
module Mux (input wire[7:0] iterate, input wire deterministicEnable, input wire bistMode, input wire enable, input wire clk, input wire rst, output reg[127:0] valueO);
reg [9:0] seedVal[0:2];
reg[31:0] generatePattern [0:3],temp;
integer i;
always begin
@(deterministicEnable)begin
if(deterministicEnable==1)begin
temp<={22'b000000000000,seedVal[iterate]};
end
end
end
always@(posedge clk)begin
if(rst)begin
temp<=32'b11111111111111111111111111111111;
seedVal[0]<=10'b1001100101;
seedVal[1]<=10'b1111111111;
seedVal[2]<=10'b0000011111;
generatePattern[0]<=32'b00000000000000000000000000000000;
generatePattern[1]<=32'b00000000000000000000000000000000;
generatePattern[2]<=32'b00000000000000000000000000000000;
generatePattern[3]<=32'b00000000000000000000000000000000;
end
else begin
if((bistMode==1) && (enable==1))begin
for(i=0;i<4;i=i+1)begin
temp = {(temp[31] ^ temp[25] ^ temp[22] ^ temp[21] ^ temp[15] ^ temp[11] ^ temp[10] ^ temp[9] ^ temp[7] ^ temp[6] ^ temp[4] ^ temp[3] ^ temp[1] ^ temp[0]), temp[31:1]};
generatePattern[i] = temp;
end
valueO = {generatePattern[3],generatePattern[2],generatePattern[1],generatePattern[0]};
end
end
end
endmodule
-
正如David所建议的,这是不可合成的,因为您从两个不同的始终块驱动
temp
。要使其发挥作用,您需要将两者合并为一个。 -
第一个总是完全混乱的,由于灵敏度列表被截断,它在模拟中表现为混乱的触发器。即使合成工具会对块执行某些操作,结果也不会与模拟相匹配。
-
第二个块可能是可合成的,但由于对相同的变量混合使用块/非块分配,它在硬件中的表现可能与在模拟中不同。
那么,该怎么办。
- 您需要从其中的2个中创建一个始终块。很难看出你的意图是什么,但总的来说,它可能看起来像:
always @(posedge clk) begin
if (rst) ...
else if (deterministicEnable) ...
else if if((bistMode==1) && (enable==1)) ..
end
似乎
temp
和generatePattern
都是内部变量,它们不需要任何重置。因此,将它们从if (rst)
库中删除。我认为在您的代码中根本不需要temp
。您可以将其完全移除。seedVal
也没有用处,所以我根本不明白为什么要初始化它们。使用阻塞赋值(=(将
temp
和generatePattern
赋值是正确的,因为它们是内部变量。但是value0
不是内部的,您应该使用nba(<=(进行分配。由于这个原因,value0
变量应该用rst
信号初始化,但事实并非如此。
否,这是不可合成的,始终块为其中分配的所有信号创建一个驱动器,并且每个信号必须始终只有一个驱动器(忽略与此处无关的三态的一些例外(。
always begin
@(deterministicEnable)begin
据我所知,也是不可合成的。如果您想要组合(非时钟(,请使用always @* begin
。