两个总是阻塞在同一个模块中.如果下面的技巧是错误的,有人建议我另一种方法



我在同一个模块中使用两个始终块。它会导致合成代码出错吗?源代码是在下面给出的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
  1. 正如David所建议的,这是不可合成的,因为您从两个不同的始终块驱动temp。要使其发挥作用,您需要将两者合并为一个。

  2. 第一个总是完全混乱的,由于灵敏度列表被截断,它在模拟中表现为混乱的触发器。即使合成工具会对块执行某些操作,结果也不会与模拟相匹配。

  3. 第二个块可能是可合成的,但由于对相同的变量混合使用块/非块分配,它在硬件中的表现可能与在模拟中不同。

那么,该怎么办。

  1. 您需要从其中的2个中创建一个始终块。很难看出你的意图是什么,但总的来说,它可能看起来像:
always @(posedge clk) begin
if (rst) ...
else if (deterministicEnable) ...
else if if((bistMode==1) && (enable==1)) ..
end
  1. 似乎tempgeneratePattern都是内部变量,它们不需要任何重置。因此,将它们从if (rst)库中删除。我认为在您的代码中根本不需要temp。您可以将其完全移除。seedVal也没有用处,所以我根本不明白为什么要初始化它们。

  2. 使用阻塞赋值(=(将tempgeneratePattern赋值是正确的,因为它们是内部变量。但是value0不是内部的,您应该使用nba(<=(进行分配。由于这个原因,value0变量应该用rst信号初始化,但事实并非如此。

否,这是不可合成的,始终块为其中分配的所有信号创建一个驱动器,并且每个信号必须始终只有一个驱动器(忽略与此处无关的三态的一些例外(。

always begin
@(deterministicEnable)begin

据我所知,也是不可合成的。如果您想要组合(非时钟(,请使用always @* begin

相关内容

最新更新