verilog 想必做数字的工程师听起来不陌生吧。
用verilog设计电路,效率相对较高,但是verilog 语言入门比较难。verilog语言仍有很多弊端。
小编带领大家看一看verilog的变性人systemverilog。
简单的说一个应用背景吧:对于一个8位sram来说,测试要覆盖所有可能性,这个数据量是很大的,而且对于verilog来说并不容易实现。简而言之,验证需要大量的随机数据,systemverilog产生随机数据就比较容易。
那么怎么实现呢?
1: 使用rand关键字给信号添加随机属性。
rand reg [7:0] words;
rand reg[2:0] op;
2: 但是对于8位的sram来说,words只能在0 到 2的8次方减去一之间波动,这个不用考虑,如果做测试约束一下会方便很多。例如预设op = 2‘b01时做加法运算,我用以下方法约束op会使得测试更加方便。
op inside {1:1};
本文只是引子,op我还可以加入判断,进行多条件的测试,不过难度就大了些,感兴趣自行能够查阅资料。
-----------------------------------------------------------------------------------------------------------------------------------
要学习新语言,对于硬件设计来说,重要的是数据类型。
先初步回顾一下verilog 数据类型:
两种基本类型: reg和wire 四种状态: 0,1,z,x
基本变量有:
reg 1位或多位
integer 32-signed
time 64-unsinged
real 浮点
所有的变量都是静态存储的,也就是说在整个仿真过程中是alive的。因此不能用stack来hold arguments and local values。
这样占有太多的存储空间,对大型设计是不利的。
sv 的数据类型logic做到了很好的改善,可以连续赋值,值得注意的是logic不能多路驱动。
sv的两态数据类型可以大幅度提高仿真性能和内存的使用量。
bit b; // 2-state, single-bit
bit [31:0] b32; // 2-state, 32-bit unsigned integer
int i; // 2-state, 32-bit signed integer
byte b8; // 2-state, 8-bit signed integer
shortint s; // 2-state, 16-bit signed integer
longint l; // 2-state, 64-bit signed integer
说个细节:bit[7:0](0 -- 255) 不等于byte(-128 -- 127)。
有人可能会提出如果驱动的X或者Z状态,当定义为bit时会转化为0或1,仿真或许看不到Z或Z。这个可以用内封装的$isunkown来进行判断。
数组区别不再赘述。最大优点sv可以支持动态宽度的存储。
接下来说个verilog根本没有的东西,队列操作。
例如:int a[$] ={1,2};
可以轻松的进行类似OOP语言java,python等的插入,删除等操作,非常方便。
结构体,枚举类型,String类型等,优点太多了。感兴趣自行查找相关资料。
若文章有技术问题,请留言纠正,谢谢