Verilog HDL的一些不常见语法
26 Feb 2019 3300字 12分 次 Verilog HDL打赏作者 CC BY 4.0 (除特别声明或转载文章外)
1 前言
记录一下看到的奇奇怪怪的写法,我 觉得不常见的。
2 for
for循环语法为:
八位乘法器实现:
这是一个并行完全展开语句,而不是串行多周期执行。
该代码实践的是一个全并行的加法器。for语句等效于将以下语句完全展开:
3 缩减运算符
等效于:
4 定义存储器模型(RAM)
RegFile对象在Altera FPGA中将被识别为16个32位位宽的RAM,且指定为MLAB类型。在ASIC设计中,这种描述方式只会被识别为一系列的寄存器堆,并不会识别为RAM。在ASIC中应当利用RAM单元库(IP)梨花的方法描述RAM。
5 task和function
5.1 task
task概述:
- 含有input、output、inout语句;
- 可以调用function;
- 消耗仿真时间:
- 延迟:
- 时钟周期:
- 事件:
举例:
5.2 function
function概述:
- 执行时不消耗仿真时间;
- 不能有控制仿真时间的语句,例如task中的延时等;
- 不能调用task;
- void function没有返回值;
function语法为:
计算有符号数绝对值的例子:
6 并发操作
并发性是指对于所有并发线程,在仿真工具的当前仿真时间内,安排好的时间在仿真步进到下一個仿真时间之前都会执行完成。
当一个线程执行时,只有遇到wait语句才会停止,例如:
6.1 initial
在整个仿真时间内只执行一次,各个initial语句并发执行。
6.2 always
对组合和时序电路建模,always语句并发执行。
6.3 assign
对组合电路建模,并发执行。
6.4 begin end
内部语句从上往下顺序执行。
6.5 fork join
内部语句并行执行,与顺序无关。例如:
7 generate
7.1 for循环
8位加法器例化过程:
在for循环里使用always语句:
7.2 if-else例化
数据宽度不同乘法器的例化过程:
7.3 generate-case例化
数据宽度不同乘法器的例化过程:
8 宽度定义
X的宽度为B,高位为(A+B),低位为B。
Y的宽度为D,高位为C,低位为(C-D)。
9 运算符
这个不少见,只是总结一下:
符号 | 含义 | 备注 |
---|---|---|
~ | 按位取反 | 将多位操作数按位取反:a=4’b1001,~a=4’b0110 |
! | 逻辑取反 | 将操作数逻辑取反:操作数为0,取反结果为1;操作数不为0,取反结果为0 |
& | 按位与 | 两个多位操作数按位进行与运算:a=4’b1001,b=4’b0011,a&b=4’b0001 |
&& | 逻辑与 | 对两个操作数进行逻辑与:两者相同结果为1,否则为0 |
| | 按位或 | 两个多位操作数按位进行或运算:a=4’b1001,b=4’b0011,a|b=4’b1011 |
|| | 逻辑或 | 对两个操作数进行逻辑或:二者其中至少有一个不为0,则结果为1;否则为0 |
^ | 按位异或 | 两个多位操作数按位进行异或操作:a=4’b1001,b=4’b0011,a^b=4’b1010 |
^~或~^ | 按位同或 | 两个多位操作数按位进行同或操作:a=4’b1001,b=4’b0011,a^b=4’b0101 |
10 系统函数
10.1 随机
返回一个32位的有符号的随机数:
返回一个32位的无符号的随机数:
生成有一定范围的无符号的随机数:
随机选择有权重的可执行语句:
10.2 停止
停止运行:
告辞。