一 . 赋值语句
1.连续赋值语句是数据流建模的基本语句,用于对 wire 型变量进行赋值。
比如assign xx = xx;
对于它有几点注意:
***等式右边的类型没有要求,等式右边的值一旦发生变化,就会立刻重新计算并同时赋值给左侧
***等式左边不能是寄存器类型,可以是线性变量
2.过程赋值语句
- 过程赋值是在 initial 或 always 语句块里的赋值,主要用于对寄存器类型变量进行赋值
- 寄存器变量在被赋值后,其值将保持不变,直到重新被赋予新值
- 过程赋值只有在语句执行的时候,才会起作用
- Verilog 过程赋值包括 2 种语句:阻塞赋值与非阻塞赋值
always语句块:
always @(event)
[statement]
always{时序控制} // 时序控制可不要
过程赋值语句等
第一个模板上面括号内的内容称为敏感变量,即整个always 语句当敏感变量有变化时被执行,否则不执行。
第二个模板表示always过程在0时间开始时执行其中的行为语句。当最后一句执行语句执行结束后,在时序控制下循环继续执行第一句执行语句直到仿真结束。如果缺少时序控制会一直喜欢下去。
在always块中,可以是时序逻辑,也可以是组合逻辑。时序逻辑和组合逻辑的区别在于always敏感列表中有没有时钟信号参与,有时钟信号参与的是时序逻辑,没有时钟信号参与的是组合逻辑。wire使用assign赋值,reg型适用于过程语句赋值,在always过程块中要求被赋值变量必须为reg型。
语句块中的语句会重复执行
一个变量不能在多个 always 块中被赋值
在 always 块中被赋值的只能是 reg 型变量
initial语句块 :
initial
[single statement]
initial begin
[multiple statements]
end
该语句引导的过程快只执行一次,在0时刻开始并发执行到当前状态结束,在一个模块内每个initial块都是独立并发执行。
举两个例子
module stimulus;//定义一个模块
reg a,b,m;
initial
m = 1'b0; // 单个过程语句
initial begin
#5 a = 1'b1; // 多个过程语句情况
#25 b = 1'b0;
end
endmodule
这两种语句之间的执行是并行的,即语句的执行与位置顺序无关。
这两种语句通常与语句块begin ....end相结合(可以看initial语句的举例代码),则语句块中的执行是按顺序执行的。
与 fork...join 结合的时候:语句块中的语句并发执行,但该语句块不可综合,一般只用测试
3.if语句
实现的作用实际是选择器。
assign out = (condition) ? x : y;
括号中的即为条件
condition为真,out值为x,为假,out=y.
上图的代码实现:
always @(*) begin
if (condition) begin
out = x;
end
else begin
out = y;
end
end