您的位置 首页 培训

SystemVerilog言语简介

Verilog模块之间的连接是通过模块端口进行的。为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。不幸的是,在设计的早期,我们很难把握设计的细节。

1. 接口(Interface)

Verilog模块之间的衔接是经过模块端口进行的。为了给组成规划的各个模块界说端口,咱们有必要对希望的硬件规划有一个具体的知道。不幸的是,在规划的前期,咱们很难掌握规划的细节。而且,一旦模块的端口界说完成后,咱们也很难改动端口的装备。别的,一个规划中的许多模块往往具有相同的端口界说,在Verilog中,咱们有必要在每个模块中进行相同的界说,这为咱们增加了无谓的工作量。

SystemVerilog供给了一个新的、高层笼统的模块衔接,这个衔接被称为接口(Interface)。接口在关键字interface和endinterface之间界说,它独立于模块。接口在模块中就像一个单一的端口相同运用。在最简略的方式下,一个接口能够认为是一组线网。例如,能够将PCI总线的一切信号绑定在一起组成一个接口。经过运用接口,咱们在进行一个规划的时分能够不需求首要树立各个模块间的互连。跟着规划的深化,各个规划细节也会变得越来越明晰,而接口内的信号也会很简单地表明出来。当接口发生改动时,这些改动也会在运用该接口的一切模块中反映出来,而无需更改每一个模块。下面是一个接口的运用实例:

interface chip_bus; // 界说接口
wire read_request, read_grant;
wire [7:0] address, data;
endinterface: chip_bus

module RAM (chip_bus io, // 运用接口
input clk);
// 能够运用io.read_request引证接口中的一个信号
endmodule

module CPU(chip_bus io, input clk);

endmodule

module top;

reg clk = 0;

chip_bus a; // 实例接口

// 将接口衔接到模块实例

RAM mem(a, clk);

CPU cpu(a, clk);

endmodule

实际上,SystemVerilog的接口不仅仅能够表明信号的绑定和互连。因为SystemVerilog的接口中能够包含参数、常量、变量、结构、函数、使命、initial块、always块以及接连赋值句子,所以SystemVerilog的接口还能够包含内建的协议查看以及被运用该接口的模块所共用的功用。

2. 大局声明和句子

在Verilog中,除了一个模块能够作为模块实例引证其他模块外,并不存在一个大局空间。别的,Verilog答应恣意数目的顶层模块,因而会发生毫无相关的层次树。

SystemVeriog增加了一个被称为$root的隐含的尖端层次。任安在模块鸿沟之外的声明和句子都存在于$root空间中。一切的模块,不管它处于哪一个规划层次,都能够引证$root中声明的姓名。这样,假设某些变量、函数或其它信息被规划中的一切模块同享,那么咱们就能够将它们作为大局声明和句子。大局声明和句子的一个运用实例如下:

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

3. 时刻单位和精度

在Verilog中,表明时刻的值运用一个数来表明,而不带有任何时刻单位。例如:

forever #5 clock = ~clock;

从这一句中咱们无法判别5代表的是5ns? 5ps? 仍是其他。Verilog的时刻单位和精度是作为每一个模块的特点,并运用编译器指令`timescale来设置。运用这种办法具有固有的缺点,因为编译器指令的履行依赖于源代码的编译次序,编译器总是将它遇到的最终一个`timescale设置的时刻单位和精度作为之后的规范。那么,假设有些模块之前没有运用`timescale设置时刻单位和精度,这就有或许呈现同一个源代码的不同仿真会呈现不同成果的状况。

SystemVerilog为了操控时刻单位参加了两个重要的增强。首要,时刻值能够显式地指定一个单位。时刻单位可所以s、ms、ns、ps或fs。时刻单位作为时刻值的后缀呈现。例如:

forever #5ns clock = ~clock;

其次,SystemVerilog答应运用新的关键字(timeunits和timeprecision)来指定时刻单位和精度。这些声明能够在任何模块中指定,一起也能够在$root空间中大局指定。时刻单位和精度有必要是10的幂,规模能够从s到fs。例如:

timeunits 1ns;

timeprecision 10ps;

4. 笼统数据类型

Verilog供给了面向底层硬件的线网、寄存器和变量数据类型。这些类型代表了4态逻辑值,一般用来在底层上对硬件进行建模和验证。线网数据类型还具有多个强度等级,而且能够为多驱动源的线网供给解析功用。

SystemVerilog包含了C言语的char和int数据类型,它答应在Verilog模型和验证程序中直接运用C和C++代码。Verilog PLI不再需求集成总线功用模型、算法模型和C函数。SystemVerilog还为Verilog参加了几个新的数据类型,以便能够在更笼统的层次上建模硬件。

l char:一个两态的有符号变量,它与C言语中的char数据类型相同,可所以一个8位整数(ASCII)或short int(Unicode);

l int:一个两态的有符号变量,它与C言语中的int数据类型类似,但被精确地界说成32位;

l shortint:一个两态的有符号变量,被精确地界说成16位;

l longint:一个两态的有符号变量,它与C言语中的long数据类型类似,但被精确地界说成64位;

l byte:一个两态的有符号变量,被精确地界说成8位;

l bit:一个两态的能够具有恣意向量宽度的无符号数据类型,能够用来代替Verilog的reg数据类型;

l logic:一个四态的能够具有恣意向量宽度的无符号数据类型,能够用来代替Verilog的线网或reg数据类型,但具有某些约束;
l shortreal:一个两态的单精度浮点变量,与C言语的float类型相同;

l void:表明没有值,能够界说成一个函数的返回值,与C言语中的意义相同。

SystemVerilog的bit和其他数据类型答应用户运用两态逻辑对规划建模,这种办法对仿真功用更有功率。因为Verilog言语没有两态数据类型,因而许多仿真器都经过将这种功用作为仿真器的一个选项供给。这些选项不能够在一切的仿真器之间移植,而且在需求时用三态或四态逻辑的规划中强制运用两态逻辑还具有副作用。SystemVerilog的bit数据类型能够极大改善仿真器的功用,一起在需求的时分依然能够运用三态或四态逻辑。经过运用具有确认行为的数据类型来代替专有的仿真器选项,两态模型能够在一切的SystemVerilog仿真器间移植。

SystemVerilog的logic数据类型比Verilog的线网和寄存器数据类型愈加灵敏,它使得在任何笼统层次上建模硬件都愈加简单。logic类型能够以下面的任何一种办法赋值:

l 经过恣意数目的进程赋值句子赋值,能够代替Verilog的reg类型;

l 经过单一的接连赋值句子赋值,能够有约束地代替Verilog的wire类型;

l 衔接到一个单一原语的输出,能够有约束地代替Verilog的wire类型;

因为logic数据类型能够被用来代替Verilog的reg或wire(具有约束),这就使得能够在一个更高的笼统层次上建模,而且跟着规划的不断深化能够参加一些规划细节而不用改动数据类型的声明。logic数据类型不会表明信号的强度也不具有线逻辑的解析功用,因而logic数据类型比Verilog的wire类型更能有效地仿真和归纳。

5. 有符号和无符号限定符

缺省状况下,Verilog net和reg数据类型是无符号类型,integer类型是一个有符号类型。Verilog-2001规范答应运用signed关键字将无符号类型显式地声明成有符号类型。SystemVerilog参加了类似的才能,它能够经过unsigned关键字将有符号数据类型显式地声明成有无符号数据类型。例如:

int unsigned j;

值得注意的是unsigned在Verilog中是一个保留字,但并没有被Verilog规范运用。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/192763.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部