Menu
CoddyTech

阻塞赋值

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 49 课,共 90 课。

Verilog 有两种过程赋值:阻塞赋值(=)和非阻塞赋值(<=)。本课中,我们重点学习阻塞赋值。

阻塞赋值使用 = 运算符。它被称为“阻塞”,因为它会阻止下一条语句执行,直到当前赋值完成。代码会按顺序逐步运行。

语法:

variable = expression;

何时使用阻塞赋值

阻塞赋值(=)用于组合逻辑:输入改变时,输出会立即改变的电路,并且没有时钟,也没有存储器。

组合逻辑示例:

  • 与门 / 或门 / 异或门
  • 加法器和减法器
  • 多路复用器
  • 解码器

Verilog 示例:

always @(*) begin
  sum = a + b;      // 阻塞赋值
  carry = a & b;    // 阻塞赋值
end

Always 块中的阻塞赋值(组合逻辑)

always @(*) begin
  temp = a & b;    // 第 1 步
  out = temp | c;  // 第 2 步(使用第 1 步得到的 temp)
end

顺序很重要。对于组合逻辑来说,这样没问题。

阻塞与非阻塞

 阻塞(=)非阻塞(<=)
执行依次执行同时执行
下一行会等待吗?会不会
用途组合逻辑时序逻辑(触发器)

重要:不要在触发器中使用阻塞赋值

challenge icon

挑战

使用一个临时变量,添加缺少的阻塞赋值来交换 x 和 y 的值。

要做什么:

  1. 将 x 的值赋给 temp(把 x 保存在 temp 中)
  2. 将 y 的值赋给 x(把 y 移到 x 中)
  3. 将 temp 的值赋给 y(把保存的 x 移到 y 中)

亲手试试

module swap;
  reg x, y;
  reg temp;
  
  initial begin
    x = 1;
    y = 0;
    
    $display("Before swap: x=%d, y=%d", x, y);
    
    // TODO:第 1 步,将 x 的值赋给 temp
    
    // TODO:第 2 步,将 y 的值赋给 x
    
    // TODO:第 3 步,将 temp 的值赋给 y
    
    $display("After swap: x=%d, y=%d", x, y);
    $finish;
  end
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器