数据流建模
学习目标
讲述连续赋值语句(assign)、对于连续赋值语句的限制以及隐式连续赋值语句
解释赋值延迟、隐式赋值延迟以及用于连续赋值语句的线网声明延迟
定义表达式、操作符合操作数
列表解释所有类型的操作符(算术、逻辑、关系、等价、按位、缩减、移位、拼接和条件等)
使用数据流结构对实际的数字电路建模
1连续赋值语句
是Verilog数据流建模的基本语句,用于对线网进行赋值。等价于门级描述,是从更高的抽象角度对电路进行描述
连续赋值语句必须以关键词assign开始,其语法如下:
countinus_assign : :=assign [drive_strength ] [delay3 ] list_of_net_assignments ; list_of_net_assignments : := net_assignment {, net_assignment} net_assignment : :=net_lvalue = expression
特点:
连续赋值语句的左值必须是一个标量或向量线网,或标量或向量线网的拼接,而不能是向量或向量寄存器
连续赋值语句总是处于激活状态
操作数可以是标量或向量的线网或寄存器,也可以是函数调用
赋值延迟用于控制对线网赋予新值的时间,根据仿真时间单位进行说明
1.1隐式连续赋值
在线网声明的同时对其进行赋值。由于线网只能被声明一次,因此对线网的隐式声明赋值只能有一次
//普通的连续赋值 wire out; assign out = in1&in2; //使用隐式连续赋值实现与上面两条语句同样的功能 wire out = in1&in2;
1.2隐式线网声明
如果一个信号名被用在连续赋值语句的左侧,那么Verilog编译器认为该信号是一个隐式声明的线网。如果线网被连接到模块的端口上,则Verilog编译器认为隐式声明
线网的宽度等于模块端口的宽度
1 //连续赋值,out为线网类型 2 wire i1,i2; 3 assign out=i1&i2;//注意,out并未声明为线网,但Verilog仿真器会推断出来 4 // out是一个隐式声明的线网
2延迟
连续赋值语句中的延迟用于控制任一操作数发生变化到语句左值被赋予新值之间的时间间隔
普通赋值延迟、隐式赋值延迟、线网声明延迟
普通赋值延迟
指定延迟的第一种方法是在连续赋值语句中说明延迟值,延迟值位于关键字assign的后面
2.2隐式连续赋值延迟
使用隐式连续赋值语句来说明对线网的赋值以及赋值延迟
2.3线网声明延迟
Verilog允许在声明线网的时候指定一个延迟,这样对该线网的任何赋值都会被推迟指定的时间
//连续赋值语句中的延迟 assign #10 out = in1 & in2; //隐式连续赋值延迟 wire #10 out = in1&in2; //线网延迟 wire #10 out; assign out = in1&in2;
3表达式、操作符和操作数
3.1表达式
有操作符和操作数构成。目的是根据操作符的意义计算出一个结果值
3.2操作数
注意某些语法结构要求使用特定类型的操作数。
3.3操作符
对操作数进行运算并产生一个结果
4操作符类型
操作类型 | 操作符 | 执行的操作 | 操作数的个数 |
算术 | * | 乘 | 2 |
/ | 除 | 2 | |
+ | 加 | 2 | |
- | 减 | 2 | |
% | 取模 | 2 | |
** | 求幂 | 2 |
操作类型 | 操作符 | 执行的操作 | 操作数个数 |
逻辑 | ! | 逻辑求反 | 1 |
&& | 逻辑与 | 2 | |
|| | 逻辑或 | 2 | |
关系 | > | 大于 | 2 |
< | 小于 | 2 | |
>= | 大于等于 | 2 | |
<= | 小于等于 | 2 | |
等价 | == | 相等 | 2 |
!= | 不等 | 2 | |
=== | case相等 | 2 | |
!== | case不等 | 2 |
操作类型 | 操作符 | 执行的操作 | 操作数的个数 |
按位 | ~ | 按位求反 | 1 |
& | 按位与 | 2 | |
| | 按位或 | 2 | |
^ | 按位异或 | 2 | |
^~或~^ | 按位同或 | 2 | |
缩减 | & | 缩减与 | 1 |
~& | 缩减与非 | 1 | |
| | 缩减或 | 1 | |
~| | 缩减或非 | 1 | |
^ | 缩减异或 | 1 | |
^~或~^ | 缩减同或 | 1 | |
移位 | >> | 右移 | 2 |
<< | 左移 | 2 | |
>>> | 算术右移 | 2 | |
<<< | 算术左移 | 2 | |
拼接 | { } | 拼接 | 任意个数 |
复制 | {{ }} | 复制 | 任意个数 |
条件 | ?: | 条件 | 3 |
4.1算术操作符
双目和单目
双目
若操作符任意一位为x,那么运算结果的全部位为x
单目
使用整数或实数来表示负数
4.2逻辑操作符
逻辑操作符的计算结果是1位的值:0表示假,1表示真,x表示不确实能够;
如果一个操作数不为0,则等价于逻辑1(真);如果它等于0,则等价于逻辑0(假);如果任意一位为x或z,则它等价于x(不确定),则仿真器
一般将其作为假来处理。
逻辑操作符取变量或表达式作为操作数。
4.3等价操作符
表达式 | 说明 | 可能的逻辑值 |
a==b | a等于b,若在a或b中有x或z,则结果不定 | 0,1,x |
a!=b | a不等于b,若在a或b中有x或z,则结果不定 | 0,1,x |
a===b | a等于b,包括x或z | 0,1 |
a!==b | a不等于b,包括x或z | 0,1 |
逻辑等价操作符和case等价操作符是不同的,对逻辑等价操作符,如果操作数的某位为x或z,则结果为x;而case等价操作符必须包括x和z逐位的精确比较,
只有在两者完全相等的情况下,结果才会为1,否则为0,。case等价操作符产生的结果肯定不会为x。
4.4缩减操作符
缩减操作符只有一个操作数,它对这个向量操作数作逐位进行操作,产生一个一位的结果。
缩减与和缩减与非,缩减或和缩减或非,缩减异或和缩减同或的计算结果恰好相反。
4.5操作符的优先级
操作 | 操作符号 | 优先级别 |
单目运算 | + - ! ~ | 最高 |
乘、除、取模 | * / % | |
加、减 | + - | |
移位 | << >> | |
关系 | < <= > >= | |
等价 | == != | |
=== !== | ||
缩减 | & ~& | |
^ ^~ | ||
| ~| | ||
逻辑
|
&& | |
|| | ||
条件 | ?: | 最低 |