gpt4 book ai didi

verilog - 如何在组合 always block 中将默认值分配给输出,这样即使使用不完整的 if-else 语句也不会推断锁存器

转载 作者:行者123 更新时间:2023-12-04 12:26:38 26 4
gpt4 key购买 nike

假设我想编写一个使用 4 个输入和 3 个输出的组合模块。为了模拟我的逻辑,我做了这样的事情:

module ifelse (
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);

always @* begin

if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
end
end
endmodule

好的,我知道这段代码会推断出 y1y2y3 的闩锁,以及避免的方法这是始终为每个 if-else block 中的每个 LHS 分配一个值,如下所示:

module ifelse (
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);

always @* begin

if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
y2 = 1'bx;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
y3 = 1'bx;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
y1 = 1'bx;
end
else begin
y1 = 1'bx;
y2 = 1'bx;
y3 = 1'bx;
end
end
endmodule

但是现在,想象一下有很多 if-else block (我正在尝试描述一个教学微处理器的控制单元)并且有很多输出来自这个模块(微处理器数据路径中所有寄存器的控制线)。必须为每个 if-else block 中的每个输出分配一个值肯定会导致代码不可读且无法维护,因为我在此 always 中包含的每个新输出都将具有包含在所有 if-else block 中。

然后,我的问题是:我是否必须明确地为我未在特定 if-else block 中使用的所有输出分配一个值。对于未在组合 always block 中更新的信号,是否没有类似于“默认值”的东西,以便在评估 always block 之后,所有未分配的输出都恢复为默认值值,还是“不关心”值?

到目前为止,我已经有了这个似乎有效的解决方法:

module ifelse(
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);

always @* begin
// default values
y1 = 1'bx;
y2 = 1'bx;
y3 = 1'bx;

if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
end
end
endmodule

但我想要更优雅的东西,就像 Verilog 2001 处理组合 always 的敏感度列表一样,像这样:

module ifelse(
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);

always @* begin
if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
end
@* = x; // unassigned outputs receive a default value of "dont care"
end
endmodule

因此,如果我修改此 always 以添加仅在几个 block 中更新的新输出,我不必将它也包含在“默认” block 中,同样,我不必将其包含在敏感列表中。

那么,Verilog 中是否存在这样的功能?实际上我的解决方法是这样做的方法,还是有更优雅的解决方案?

非常感谢:)

最佳答案

这样做的方法是在开始 block 的 begin 之后,第一个 if 之前,为每个 reg 分配一个默认值> 声明。如果您打算合成一个信号,则不能将 1'bx 分配给它……您希望得到什么样的硬件?请记住,信号上出现的 x 是未知值,而不是无关紧要的条件。

关于verilog - 如何在组合 always block 中将默认值分配给输出,这样即使使用不完整的 if-else 语句也不会推断锁存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20084928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com