1、wire和reg的区别和使用场景
在Verilog中,wire和reg是两种基本的数据类型,它们的区别和用途与硬件描述的逻辑特性密切相关。
1、核心区别
| 特性 | wire | reg |
| 赋值方式 | 只能通过连续赋值(assign)或模块端口连接赋值 | 只能在过程块(always、initial)中赋值 |
| 物理意义 | 电路中的物理连线(无存储能力) | 表示存储状态(可能是寄存器或组合逻辑) |
| 默认值 | z | x(未初始化) |
| 综合结果 | 连线或组合逻辑 | 组合逻辑或时序逻辑(如触发器) |
2、使用场景
(1)使用wire
模块间的信号连接:当信号需要跨模块传递时,必须使用wire(例如模块的输入输出端口);
组合逻辑的连续赋值:使用assign语句直接描述组合逻辑时,目标信号必须是wire。
testbench中,DUT的输出信号,需要用wire;
(2)使用reg
时序逻辑(寄存器):在时序逻辑的always块中赋值的信号必须使用reg,综合后通常对应寄存器;
组合逻辑的过程赋值:在组合逻辑的always块中赋值的信号也需声明为reg,尽管综合后为组合逻辑;
reg comb_out;
always @(*)
begin
comb_out = a & b; // 组合逻辑,但必须用reg
end
临时变量存储:在过程块(如always或initial)中需要暂存值的变量必须用reg。
reg temp;
always @(posedge clk) begin
temp = a + b; // 临时计算值
q <= temp;
end
备注:1、reg在时序逻辑中可能对应寄存器,但是在组合逻辑中只是语法要求,实际是组合电路;
2、输入端口只能是wire,输出端口可以是reg(若是在过程块中赋值)。
testbench中,即使是输入信号,但是是用initial赋值,也需要用reg;
2、阻塞赋值=和非阻塞赋值<=
1、阻塞赋值=
执行顺序:顺序执行,立即生效;
适用场景:组合逻辑设计;
2、非阻塞赋值<=
执行顺序:并行执行,赋值在代码块结束时统一更新;
适用场景:时序逻辑设计;
禁止混用:同一代码块中避免回合使用=和<=,可能导致不可预测结果
1380

被折叠的 条评论
为什么被折叠?



