为一个锁存器分配多个值

Assign multiple values to one latch

我需要一个锁存器,它可以接受多条总线,每条总线有一个使能信号,当该信号为高电平时,锁存器获取相关总线的值,如下所示:

我试过了:

module Test (
    input [1:0] load,
    input [15:0] bus,
    output reg [7:0] value
);

    wire [7:0] temp;
    
    assign temp = (load[0]) ? bus[7:0] : (load[1]) ? bus[15:8] : 8'bZZ;
    
    always @(load or temp) begin
        // Latch value
        if (load) begin
            value <= temp;
        end
    end
    
endmodule

还有这个:

module Test (
    input [1:0] load,
    input [15:0] bus,
    output reg [7:0] value
);
    
    always @(load or bus) begin
        // Latch value
        if (load[0]) begin
            value <= bus[7:0];
        end
        else
        if (load[1]) begin
            value <= bus[15:8];
        end
    end
    
endmodule

同样的警告出现在两个(对每个位重复):

Warning (13012): Latch Test:test|value[0] has unsafe behavior

Warning (13013): Ports D and ENA on the latch are fed by the same signal load[0]

我发现避免这些警告的唯一方法是这样的:

module Test (
    input [1:0] load,
    input [15:0] bus,
    output [7:0] value
);
    
    reg [15:0] temp;
    reg index;
    
    always @(load or bus) begin
        if (load[0]) begin
            index <= 0;
        end
        else
        if (load[1]) begin
            index <= 1;
        end
        
        // Latch value
        if (load) begin
            temp <= bus;
        end
    end
    
    assign value = temp[8*index+7 -:8];
    
endmodule

但这是一种内存浪费,因为它保存了两条总线而不是一条总线,是否可以使用一个 reg 来避免这些警告?

我认为您无法消除前两个示例中的警告 — 在锁存器启用和提供锁存器的数据之间存在真正的竞争条件。在你的第一个例子中更明显。

load变为0时,temp将同时变为Z(不关心很可能是0) latch enable 变为 0。哪个先发生显然是一场比赛。