两个总是阻塞在同一个模块中。如果以下技术有误,有人会建议我另一种方法

Two always block in the same module. If the following technique is wrong someone suggest me an alternative way

我在同一模块中使用两个 always 块。它会导致可综合代码出错吗?源代码是用下面给出的 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

不,这是不可综合的,always 块为其中分配的所有信号创建一个驱动程序,并且每个信号必须始终只有一个驱动程序(忽略此处不相关的三态的一些例外)。

always begin
    @(deterministicEnable)begin

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

  1. 正如 David 所建议的,这是不可综合的,因为您从 2 个不同的 always 块中驱动 temp。要使其正常工作,您需要将它们合并为一个。

  2. 第一个总是一团糟,由于灵敏度列表被截断,它在模拟中表现为一团糟。即使综合工具会对模块做一些事情,结果也不会与仿真相匹配。

  3. 第二个块可能是可综合的,但由于对相同变量混合使用 blocking/non-blocking 分配,它在硬件中的行为可能与在模拟中的行为不同。

那么,怎么办。

  1. 您需要从其中的 2 个中创建一个 always 块。很难看出你的意图是什么,但一般来说它可能看起来像:
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 信号初始化,但事实并非如此。