为一个锁存器分配多个值
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。哪个先发生显然是一场比赛。
我需要一个锁存器,它可以接受多条总线,每条总线有一个使能信号,当该信号为高电平时,锁存器获取相关总线的值,如下所示:
我试过了:
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。哪个先发生显然是一场比赛。