本教程将介绍systemverilog的一些新特点,这使得RTL级设计更方便更有效率。
SystemVerilog 新增加了一些操作符,其中的大部分是从C语言中引入的。新增加的操作符包括自增(++),自减(--)和赋值运算符 (+=, -=)。全等运算符(===和 !==)其作用类似于casex语句,值X和值Z都被认为是无关的。
这也是从C语言中引入的,包括do-while循环,break 和 continue。新的foreach操作符用在数组变量中。而且增强了for循环的功能,下面的做法是允许的,
for (int i = 15, logic j = 0 ; i > 0 ; i--, j = ~j)
在Verilog中, 你可以这样标识begin 和 fork语句:
在SystemVerilog语句标签可以在end处重复一遍:
这对管理代码是非常有用的。在end处的标签必须和在开始处的标签相一致。Modules, tasks 和and functions也可以在在代码的末尾处重复标签名。
在SystemVerilog中允许在所有的过程声明中添加标签:
这对for循环特别有用,因为这样的话for循环可以被终止。尽管通过这种方式增强了块的命名, 但是至少有这样一个理由取消使用他们,那就是在SystemVerilog 变量也可以在未命名的块中被使用!!
对verilog的初学者来说这也许是最难的(甚至老练的Verilog 用户也时常被难住) 是线网和变量之间的不同点。SystemVerilog 包含了太多的混乱史: 变量可以通过过程语句, 连续赋值语句和连接到module的输出端来赋值。还有我们不能连接variable到inout端口, 除非使用ref端口来传递参数。
那意味这在SystemVerilog中,我们可以在大部分时间里使用 logic 数据类型, 而在verilog中你有时得用reg而有时却得使用wire。实际上 reg和logic几乎是相互等同的, 但logic是一个更合适的名称(因为reg老是让我们往寄存器想)。
这里还有些限制,不允许给一个变量使用多次的连续赋值或是多次的输出端口连接。如果你通过这种方式给一个变量赋过值,那你将不能再用过程赋值语句给变量赋值。
有一些限制,您不允许将同一变量从几个连续分配或输出端口连接。 这是因为没有没有解析变量如没有为在多个驱动程序的情况下 nets。 还,如果指定一个变量中的这些方法一,您可能会不分配同一变量使用过程工作分配。
如果你使用Verilog-2001来编写testbench模块的话会有如下声明:
在testbench中,你可以这样声明reg 和 wire:
可以这样例化模块:
更好的做法是这样:
但按照上面那样做会有点过于重复。Systemverilog允许你使用速记符号:
如果前面正确的声明了线网和变量,也可以这样做:
logic Clock, Reset;
logic [7:0] Data;
logic [7:0] Q;
如果还嫌太过于烦琐,还可以这样写:
这样的意思是"连接所有端口到和端口相同名字的变量或线网"。
另外我们还可以只写一部分的不同名的端口连接,另外的部分同名的用.*表示。
这样的意思是“连接Clock 端口到 SysClock,然后别的端口变量连接到和端口相同名字变量或线网”。
虽然Verilog本身不是作为综合语言设计的, 但Verilog被广泛的应用于RTL 综合。我们可以很容易的写出设计错误但仿真正确的Verilog 代码, 譬如,它总是有意无意地推断出透明琐存器。SystemVerilog 的一种解决方法是引入了新的always关键字: always_comb 、always_latch 和always_ff 。
always_comb 用于描述组合逻辑。它通过读取进程中的变量和线网自动地产生完全敏感列表, 和always @ * 在Verilog-2001中一样:
always_comb
if (sel)
f = x;
else
f = y;
always_latch 和 always_ff 分别被用来推断出锁存器和触发器。下面是 always_ff的例子:
文章评论(0条评论)
登录后参与讨论