原创 SystemVerilog RTL Tutorial

2007-10-4 10:59 4242 12 12 分类: FPGA/CPLD

 


 


本教程将介绍systemverilog的一些新特点,这使得RTL级设计更方便更有效率。


新的操作符<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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 变量也可以在未命名的块中被使用!!


Relaxed Assignment Rules


verilog的初学者来说这也许是最难的(甚至老练的Verilog 用户也时常被难住) 是线网和变量之间的不同点。SystemVerilog 包含了太多的混乱史: 变量可以通过过程语句, 连续赋值语句和连接到module的输出端来赋值。还有我们不能连接variableinout端口, 除非使用ref端口来传递参数。


 


那意味这在SystemVerilog,我们可以在大部分时间里使用 logic 数据类型, 而在verilog中你有时得用reg而有时却得使用wire。实际上 reglogic几乎是相互等同的, logic是一个更合适的名称(因为reg老是让我们往寄存器想)。


 


这里还有些限制,不允许给一个变量使用多次的连续赋值或是多次的输出端口连接。如果你通过这种方式给一个变量赋过值,那你将不能再用过程赋值语句给变量赋值。


 


有一些限制,您不允许将同一变量从几个连续分配或输出端口连接。 这是因为没有没有解析变量如没有为在多个驱动程序的情况下 nets 还,如果指定一个变量中的这些方法一,您可能会不分配同一变量使用过程工作分配。


Port Connection Shorthand


如果你使用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条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条