26,911
社区成员




大佬们好,我想请教一下vivado中always块的一个问题,问题如下:
always @(*) begin
......
end
在verilog中,always @(*)将代码块涉及到的信号均列为敏感表,综合为一个组合逻辑电路;但是在always块中仅可以对reg型变量进行赋值,这不会导致资源的过多占用吗?(寄存器类型是否比门电路更耗资源?)此外,笨人有点好奇含有reg型变量的组合逻辑综合出来应该是什么样的电路呢?希望大佬们不吝赐教,指出我的错误;如果方便,也请给出综合出的电路示意图(简单示意即可),感谢!
在Verilog中,always @(*)
表示一个组合逻辑块,意味着综合工具会将代码块中涉及到的所有信号列为敏感信号,并将该代码块综合成一个组合逻辑电路。对于组合逻辑块中的赋值操作,只能对reg
类型的变量进行赋值,这不会导致资源的过多占用。这里解释一下几个关键点:
always @(*)
与 reg
型变量always @(*)
表示组合逻辑块,而非时序逻辑块。综合工具会根据组合逻辑块中的逻辑关系生成逻辑门电路,而不是触发器或寄存器。reg
型变量:在Verilog中,reg
并不一定代表物理上的寄存器。它只是表示一种变量类型,可以在过程语句(如always
块)中进行赋值。在组合逻辑块中,reg
型变量只是一个表示方法,实际综合出来的电路不会包含触发器或寄存器,而是相应的组合逻辑电路。组合逻辑电路综合出来的电路形式可能包含逻辑门(如与门、或门、非门等),这些逻辑门根据代码中的逻辑关系进行连接。例如:
always @(*) begin
if (a & b) begin
y = 1;
end else begin
y = 0;
end
end
上述代码表示一个简单的与门逻辑,综合后的电路如下:
a
, b
y
y = a & b
综合后的电路如下:
a ----\
AND ----> y
b ----/
你的问题中提到的误解在于认为reg
类型变量会导致资源的过多占用。实际上,在组合逻辑块中使用reg
类型变量不会导致寄存器资源的浪费,因为它们只是在Verilog代码中用于赋值的变量类型,最终综合成的电路还是组合逻辑电路。
假设我们有以下Verilog代码:
module example(
input wire a,
input wire b,
output reg y
);
always @(*) begin
if (a & b) begin
y = 1;
end else begin
y = 0;
end
end
endmodule
综合出来的电路图示意如下:
a ----\
AND ----> y
b ----/
这个电路图表示一个简单的与门电路,其中a
和 b
是输入信号,y
是输出信号。
always @(*)
块用于定义组合逻辑电路。reg
型变量在组合逻辑块中仅作为赋值变量,不会导致寄存器资源的浪费。有关资源占用,理解是,对于一些控制信号完全可以利用wire型变量(简单的组合逻辑)而不需要使用到寄存器进行存储?不知道这个理解是否正确?如有错误请指正,感谢!