
Verilog 中的 assign 语句用法
在 Verilog 硬件描述语言(HDL)中,assign 语句用于连续赋值。它主要用于将表达式的结果赋给一个线网类型(wire type)的变量。assign 语句通常用于组合逻辑的描述,比如多路选择器、译码器或简单的逻辑门电路等。
基本语法
assign <目标变量> = <表达式>;- <目标变量>:必须是线网类型(如 wire),不能是寄存器类型(如 reg)。
- <表达式>:可以是任何有效的 Verilog 表达式,包括位操作、逻辑操作和算术操作等。
使用示例
简单逻辑门
module and_gate ( input wire a, input wire b, output wire y ); assign y = a & b; // 与门逻辑 endmodule多路选择器
module mux_2to1 ( input wire i0, input wire i1, input wire sel, output wire out ); assign out = (sel) ? i1 : i0; // 如果 sel 为高电平,选择 i1;否则选择 i0 endmodule算术运算
module adder ( input wire [3:0] a, input wire [3:0] b, output wire [4:0] sum ); assign sum = a + b; // 4 位加法,结果需要 5 位表示 endmodule
注意事项
延迟模型:默认情况下,assign 语句没有明确的延迟。如果需要模拟传播延迟,可以使用 # 符号指定延迟时间。例如:
assign #5 y = a & b; // 表示信号经过 5 个时间单位后到达 y连续赋值与过程赋值:assign 语句与 always 块中的赋值不同。assign 是连续的,只要表达式的值发生变化,目标变量的值就会立即更新(假设没有延迟)。而 always 块中的赋值依赖于触发事件(如时钟边沿或电平变化)。
避免竞争条件:使用 assign 时要确保不会引入竞争条件,即多个 assign 语句试图同时驱动同一个线网变量的情况。这种情况会导致未定义的行为。
通过合理使用 assign 语句,可以简洁有效地描述复杂的组合逻辑电路。然而,对于时序逻辑(如触发器、寄存器等),应使用 always 块或其他适当的结构来描述。
