阻塞赋值
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 49 课,共 90 课。
Verilog 有两种过程赋值:阻塞赋值(=)和非阻塞赋值(<=)。本课中,我们重点学习阻塞赋值。
阻塞赋值使用 = 运算符。它被称为“阻塞”,因为它会阻止下一条语句执行,直到当前赋值完成。代码会按顺序逐步运行。
语法:
variable = expression;何时使用阻塞赋值
阻塞赋值(=)用于组合逻辑:输入改变时,输出会立即改变的电路,并且没有时钟,也没有存储器。
组合逻辑示例:
- 与门 / 或门 / 异或门
- 加法器和减法器
- 多路复用器
- 解码器
Verilog 示例:
always @(*) begin
sum = a + b; // 阻塞赋值
carry = a & b; // 阻塞赋值
endAlways 块中的阻塞赋值(组合逻辑)
always @(*) begin
temp = a & b; // 第 1 步
out = temp | c; // 第 2 步(使用第 1 步得到的 temp)
end顺序很重要。对于组合逻辑来说,这样没问题。
阻塞与非阻塞
阻塞(=) | 非阻塞(<=) | |
|---|---|---|
| 执行 | 依次执行 | 同时执行 |
| 下一行会等待吗? | 会 | 不会 |
| 用途 | 组合逻辑 | 时序逻辑(触发器) |
重要:不要在触发器中使用阻塞赋值
挑战
使用一个临时变量,添加缺少的阻塞赋值来交换 x 和 y 的值。
要做什么:
- 将
x的值赋给temp(把 x 保存在 temp 中) - 将
y的值赋给x(把 y 移到 x 中) - 将
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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器