System Verilog 与 Verilog 的关系
标准
当前的System Verilog标准是由IEEE(国际电子电气工程师协会)和Accellera(基于工业的标准协会)两个国际组织制定的,版本编号为3.1a,用以表明这个版本是Verilog语言的第3次重大改进。这个版本对System Verilog和Verilog两个标准都有一些修改。
IEEE标准1800-2005/IEC62530:2007
这个文件是语言参考手册(LRM),但其中只包含Verilog标准1364-2005的一些扩展的定义。为了得到System Verilog语法的全部定义,SV和V两种语言的参考手册(LRM)都是必需的。
IEEE标准1364-2005
这是最新版的Verilog标准,以前曾经有一个2001版本,但是修改的地方不多。
IEEE标准1364-1995
这是最原始的Verilog标准。绝大多数的开源工具只遵循这个原始标准。
IEEE标准1364.1-2002/IEC 62142-2005
这是Verilog RTL综合标准。这个文件定义了哪些是可综合的,哪些是不可综合的。它的基础是Verilog标准2001年版。
Accellera Verilog-AMS 2.3-2008
这个文件是描述模拟数字混合信号模型的Verilog-AMS语言标准。它的基础是Verilog标准2005年版。其中Verilog-A子集只包括连续时间元件。创建System Verilog-AMS是Accellera尚未完成的愿望。
System Verilog和Verilog之间的差别
System Verilog的基本语法中有一大部分继承自Verilog。而System Verilog语法集合中新添了一些语法条款,如断言、类和程序等。本节的宗旨是分析影响RTL硬件建模的两个Verilog版本有哪些不同,从而了解例子应如何修改才能用符合旧标准的仿真和综合工具。
Verilog 2005
下面的模块是用2005年版Verilog语言编写的红绿交通灯状态机。
module traffic_1_05 (output reg start_timer,
major_green, minor_green,
input reg clock, n_reset, timed,
car);
reg state;
parameter G=0, R=1
always @(posedge clock, negedge n_reset)
begin: SEQ
if (~n_reset)
state <= G;
else
case (state)
G: if (car)
state <= R;
R: if (timed)
state <= G;
endcase
end
always @(*)
begin: OP
start_timer = 1'bO;
minor_green = 1'bO;
major_green = 1'bO;
case(state)
G : begin
major_green = 1'b1;
if (car)
start_timer = 1'bl;
end
R: minor_green=1'bl;
endcase
end
endmodule
由于Verilog 2005 是System Verilog的子集,所以该模块可以用System Verilog编译器处理,不会出现语法错误。
该代码段与典型的SystemVerilog代码的主要不同点可罗列如下:
- always_ff被always所替代。可论证用always_ff是冗余的,因为在这里这两种形式的描述是完全相同的。
- always_comb被always@(*)所替代。敏感列表是一个通配符,其含义是该块所有输入的线网和变量都已自动地包括在内。
- logic被reg所替代。在System Verilog中这两种变量的类型是可以互换的,但是logic清楚地声明变量是逻辑类型,而reg类型的变量则有可能被错误地理解为是一个寄存器。
- 在Verilog中没有枚举类型。在Verilog中可以通过声明一个有足够多比特位的变量来保持所有这些状态,然后为每个状态设置一个参数值(parameter)来代替枚举类型的结构。在这段代码里只有两个状态,所以只需要定义一比特的状态变量就足够了。若把状态变量的类型定义为reg[l:0]则可以声明4个不同的状态。
- 没有定义长度的位串(例如'0)是不允许的。必须明确指定位串的长度,例如1'b0.
- 在System Verilog语言中,变量和线网的赋值没有什么区别。而在Verilog语言中,变量必须在过程块中赋值,而线网则必须并且只能在连续赋值语句中赋值。
Verilog1995
下面的代码段是用1995年版Verilog语言编写的红绿交通灯状态机。
module traffic_l_95 (start_timer , major_green,
minor_green, clock, n_reset,
timed, car);
output start_timer, major_green, minor_green;
input clock, n_reset, timed, car;
reg start_timer, major_green, minor_green;
reg state;
parameter G=0, R=l;
always @(posedge clock or negedge n_reset)
begin: SEQ
if (~n_reset)
state <= G;
else
case(state)
G: if (car)
state <= R;
R : if (timed)
state <= G;
endcase
end
always @(timed or car or present_state)
begin:OP
start_timer = 1'bO;
minor_green = 1'bO;
major_green = 1'bO;
case (state)
G: begin
major_green = 1'b1;
if (car)
start_timer = l'bl;
end
R: minor_green = 1'b1;
endcase
end
endmodule
Verilog1995是Verilog2005的子集,更是System Verilog的子子集。换言之,System Verilog和Verilog-2005都是Verilog-1995的超集。
Verilog-1995与Verilog-2005主要的差别在于以下三点:
- 不允许使用ANSI C风格的模块头。换言之,模块的声明的头语句中只能包括输入和输岀信号名。端口定义和变量类型必须用另一语句描述。在下面的语句中声明模块信号端口形式:input(输人端口),output(输岀端口),inout(双向端口)。最后,必须定义输出类型为reg默认的类型为wire,因此输岀信号需要分三条语句(信号名、端口、类型)定义。
- 在敏感或者事件列表中,必须有关键字or,不能使用逗号。这个关键字or不是布尔值的逻辑或操作,而是事件的或。
- 在敏感列表中,不允许使用通配符。必须列出组合过程中的每个输入。“输入”包括赋值等号右侧的每一个信号,或者在if和case条件分支语句中,判断后有可能执行行的每个分支。这里很可能发生错误。若漏写了某个输人,仿真在运行时不一定能发现这个问题,但综合器很可能“纠正”这个错误。因此,很可能出现综合和仿真不一致的情况。
NOW现在行动!
学习Xilinx FPGA最好的资料其实就是官方手册,下表总结了部分手册的主要介绍内容,关注我,持续更新中......
文件名 | 主标题 | 内容简单介绍 | 是否有中文版 | |
UG476 | 7 Series FPGAs GTX/GTH Transceivers | GTX和GTH介绍,PCIe、serdes等学习必备 | 否 | |
UG471 | 7 Series FPGAs SelectIO Resources | 描述 7 系列 FPGA 中可用的 SelectIO资源。 | 否 | |
UG1114 | PetaLinux Tools Documentaton | PetaLinux 工具文档 参考指南 | 是,V2019.2 | |
UG949 | UltraFAST 设计方法指南(适用于 Vivado Design Suite) | 赛灵思® UltraFast™ 设计方法是用于为当今器件优化设计进程的一套最佳实践。这些设计的规模与复杂性需要执行特定的步骤与设计任务,从而确保设计每一个阶段的成功开展。依照这些步骤,并遵循最佳实践,将帮助您以最快的速度和最高的效率实现期望的设计目标 | 是,V2018.1 | |
IP手册 | pg057 | FIFO Generator | FIFO生成器IP使用手册 | 否 |
pg104 | Complex Multiplier | 复数乘法器IP使用手册 | 否 | |
pg122 | RAM-Based Shift Register | 移位寄存器IP使用手册 | 否 |