文章目录
- 一、System-Verilog介绍
- 1.1System-Verilog
- 二、简单的语法介绍
- 2.1接口实例
- 2.2全局声明和语句实例
- 2.3时间单位和精度
- 2.4用户定义的类型
- 2.5 枚举类型
- 三、流水灯
- 参考
一、System-Verilog介绍
1.1System-Verilog
SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、 接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。
SystemVerilog由Accellera开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。
二、简单的语法介绍
2.1接口实例
interface chip_bus;// 定义接口wireread_request, read_grant;wire [7:0]address, data;endinterface: chip_bus
module RAM(chip_bus io, // 使用接口inputclk);//可以使用io.read_request引用接口中的一个信号endmodule
module CPU(chip_busio, input clk);...endmodule
module top;reg clk = 0;chip_busa; // 实例接口//将接口连接到模块实例RAM mem(a,clk);CPU cpu(a,clk);endmodule
2.2全局声明和语句实例
reg error_flag; // 全局变量function compare(...); // 全局函数
always@(error_flag) // 全局语句
...
module test;
chip1 u1(...)
endmodule
module chip1(...);
FSM u2(...);
always@(data)
error_flag= compare(data, expected);
endmodule
module FSM(...);
...
always @(state)
error_flag= compare(state, expected);
endmodule
2.3时间单位和精度
在Verilog中,表示时间的值使用一个数来表示,而不带有任何时间单位。例如:
`forever #5clock= ~clock;`
SystemVerilog为了控制时间单位加入了两个重要的增强。首先,时间值可以显式地指定一个单位。时间单位可以是s、ms、ns、ps或fs。时间单位作为时间值的后缀出现。例如:
forever #5nsclock= ~clock;
其次,SystemVerilog允许使用新的关键字(timeunits和timeprecision)来指定时间单位和精度。这些声明可以在任何模块中指定,同时也可以在$root空间中全局指定。时间单位和精度必须是10的幂,范围可以从s到fs。例如:
timeunits 1ns;timeprecision 10ps;
2.4用户定义的类型
Verilog不允许用户定义新的数据类型。SystemVerilog通过使用typedef提供了一种方法来定义新的数据类型,这一点与C语言类似。用户定义的类型可以与其它数据类型一样地使用在声明当中。例如:
typedefunsigned int uint;uint a, b;
一个用户定义的数据类型可以在它的定义之前使用,只要它首先在空的typedef中说明,例如:
typedef int48; // 空的typedef,在其他地方进行完整定义int48 c;
2.5 枚举类型
在Verilog语言中不存在枚举类型。标识符必须被显式地声明成一个线网、变量或参数并被赋值。SystemVerilog允许使用类似于C的语法产生枚举类型。一个枚举类型具有一组被命名的值。缺省情况下,值从初始值0开始递增,但是我们可以显式地指定初始值。枚举类型的例子如下:
enum {red,yellow, green} RGB;enum {WAIT=2’b01, LOAD, DONE} states;
我们还可以使用typedef为枚举类型指定一个名字,从而允许这个枚举类型可以在许多地方使用。例如:
typedefenum {FALSE=1’b0, TRUE} boolean;boolean ready;booleantest_complete;
三、流水灯
ed_flow.sv
module led_flow (input logic clk, // 时钟信号input logic rst_n, // 复位信号(低有效)output logic [7:0] led // 8位LED输出
);logic [23:0] counter; // 24位计数器,用于产生慢时钟信号// 计数器逻辑always_ff @(posedge clk or negedge rst_n) beginif (!rst_n)counter <= 24'd0;elsecounter <= counter + 1;end// LED流水灯逻辑always_ff @(posedge counter[23] or negedge rst_n) beginif (!rst_n)led <= 8'b0000_0001;elseled <= {led[6:0], led[7]};end
endmodule
testbench
module led_flow_tb;logic clk;logic rst_n;logic [7:0] led;// 实例化待测试的流水灯模块led_flow uut (.clk(clk),.rst_n(rst_n),.led(led));// 时钟信号生成initial beginclk = 0;forever #10 clk = ~clk; // 50MHz时钟周期为20nsend// 测试逻辑initial begin// 初始化信号rst_n = 0;#100;rst_n = 1;// 仿真运行一段时间后结束#1000000;$stop;end
endmodule
效果
参考
System Verilog简介