30,268
社区成员
发帖
与我相关
我的任务
分享大佬们好,我想请教一下vivado中always块的一个问题,问题如下:
always @(*) begin
......
end
在verilog中,always @(*)将代码块涉及到的信号均列为敏感表,综合为一个组合逻辑电路;但是在always块中仅可以对reg型变量进行赋值,这不会导致资源的过多占用吗?(寄存器类型是否比门电路更耗资源?)此外,笨人有点好奇含有reg型变量的组合逻辑综合出来应该是什么样的电路呢?希望大佬们不吝赐教,指出我的错误;如果方便,也请给出综合出的电路示意图(简单示意即可),感谢!
你问的是「在verilog中,always @(*)将代码块涉及到的信号均列为敏感表,综合为一个组合逻辑电路;但是在always块」,我结合实操说几句。
一句话:代码的本质是把『明确的问题』拆成可执行的步骤,再交给模型/工具去填。
理解时抓住主线就行,别被术语绕进去;先会用,再回来看原理,效率最高。
建议配合一个最小例子边跑边看,比纯看定义来得快。
以上是基于常见落地经验的判断,不一定全对。你那边具体是什么场景/报错?评论区说下,我帮你看。
在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, byy = 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型变量(简单的组合逻辑)而不需要使用到寄存器进行存储?不知道这个理解是否正确?如有错误请指正,感谢!