System Verilog与功能验证(二)

1、System Verilog数据类型
System Verilog新增的数据类型:
(1)两态(I/O)数据类型;
(2)枚举类型;
(3)用户自定义类型;
(4)静态数组;
(5)压缩数组;
(6)动态数组;
(7)关联数组;
(8)队列;
(9)字符串;
(10)结构体;
(11)联合体;
(12)常量。
1.1、数据类型
verilog中常用的数据类型:变量reg和网线wire,均为四态数据类型(0、1、X、Z)。变量的存储都是静态的,仿真过程中不能使用堆栈来保持参数和当前值;网线wire用来连接两个设计模块。
两态数据类型,减少仿真器对内存的使用和提高仿真的运行效率,System Verilog中常用的两态数据类型:bit,byte,shortint,int,longint。
1.1.1、按照两态和四态数据类型分类
两态数据类型(1、0),默认值为0:bit-单比特,byte-8位整型有符号数,int-32位整型有符号数,shortint-16位整型有符号数,longint-64位整型有符号数。
四态数据类型(0、1、X、Z),默认值为X:reg-无符号数,logic-无符号数,integer-32位整型有符号数。
1.1.2、其他常用的数据类型及方式
time-64位整数,单位s;
real-64位;
shortreal-32位;
string-可变长度的字符数组;
void-空返回,用于函数;
int转换无符号数:int unsigned using_int;
reg转换有符号数:reg signed sig_reg;
注意:System Verilog引入logic用来代替reg;在双向总线和多驱动的情况下,只能使用wire。
1.2、枚举类型
枚举类型用来声明一组整型的命名常量,定义具有强类型的枚举变量。
例子:枚举类型定义一组具有名字的数值,light1、light2定义成int枚举类型,包含三个成员red/green/blue

   enum{
     red,
     green,
     blue
    }light1,light2;

初始化枚举类型,不能被在枚举集合范围以为的数值直接赋值。
比如:

  initial
     begin
      light1 = red;
      light2 = blue;
     end

1.3、用户自定义类型
System Verilog中,通过使用typedef关键字进行用户自定义类型的扩展。
例子:定义LED color enum,logic [2:0] color_t,其中[2]-red,[1]-green,[0]-blue

parameter LED_WIDTH = 3;
typedf enum logic[LED_WIDTH-1:0]{
    LED_OFF      = 3'b111,
    LED_RED      = 3'b011,
    LED_GREEN    = 3'b101,
    LED_BLUE     = 3'b110
}color_t;
color_t user_color_t;
initial
 begin
  //两种初始化方式
  use_color_t = LED_OFF;
  use_color_t = color_t'(1); //通过color_t数据类型标识符做类型转换
 end

1.4、静态数组和压缩数组
静态数组是指其数组的大小在定义时被显性地指定。
System Verilog引入两种类型的数组:压缩数组和非压缩数组。
压缩数组:维数的定义在变量标识符之前;
非压缩数组:维数的定义在变量标识符之后;
例子:
bit [07:00] i; //压缩数组(比特类型)
real j [07:00]; //非压缩数组(实型)
bit [03:00] [07:00] reg_32;//4个字节压缩为32bits的向量
在这里插入图片描述
bit [03:00] [07:00] mix_array [3];//3个非压缩的数组(每个数组由4个字节压缩为32bits的向量)
在这里插入图片描述
1.5、动态数组
System Verilog提供了动态数组,可以在仿真的过程中动态分配大小。
动态数组的声明语法:
data_type array_name[];
[]表示编译时未指定数组的大小,在运行时可以动态分配。使用前必须通过调用new[],并在[]中输入期望的长度数值来分配空间。foreach会自动遍历数值中的元素。
例子:

   int dyn1[],dyn2[];//声明两个动态数组dyn1和dyn2
    initial
     begin
      dyn1 = new[50]; //给动态数组分配50个成员
      foreach(dyn1[i]) //初始化动态数组
       begin

        dyn1[i] = i;
       end
      dyn2 = new[50](dyn1); //复制dyn1数组至dyn2
      dyn2[10] = 1; //修改动态数组[10]数值为1
     end

1.6、关联数组
关联数组是一种通过标号来分配空间和访问的数组,可以精确分配至使用的特定地址。
例子:关联数组只分配0-5、45、1000、4531和200000地址的数值。
在这里插入图片描述
关联数组实现了一个所声明类型成员的查找表,用索引的数据类型作为查找表的查找值,并强制其排列顺序。
关联数组的声明语法:
data_type array_id[index_type];
data_type-数组成员的数据类型;
array_id-关联数组的变量名;
index_type-用做索引的数据类型或者是*
例子:

integer array_a [*]; //整型关联数组,未指定索引类型
bit [20:00] array_b [string]; //21比特向量的关联数组,索引为字符串

1.7、队列
队列是一个大小可变,具有相同数据类型成员额有序集合。队列能够在固定时间内访问它的所有元素,也能够在固定时间内对队列的尾部和头部插入和删除成员。队列中的每一个成员都通过一个序号来标识,0代表第一个成员, 代表最后一个成员。队列是一个一维的非压缩数组,它可以自动地增长和缩减。队列适合于实现 F I F O 和堆栈之类的数据结构。队列的定义: d a t a t y p e q u e u e n a m e [ 代表最后一个成员。队列是一个一维的非压缩数组,它可以自动地增长和缩减。队列适合于实现FIFO和堆栈之类的数据结构。 队列的定义: data_type queue_name[ 代表最后一个成员。队列是一个一维的非压缩数组,它可以自动地增长和缩减。队列适合于实现FIFO和堆栈之类的数据结构。队列的定义:datatypequeuename[];
data_type queue_name[$:maxsize];
例子:

  byte q1[$]; //字节队列
    string names[$] = ["Moonin"]; //字符串队列
    integer q[$] = {3,2,7}; //初始化整型队列
    bit q2[$:255]; //最大长度为256的比特队列

1.8、字符串
System Verilog引入一个字符串类型(string),它是一个大小可变、动态分配的字节数组。
字符串类型变量的声明语法
string varialbe_name[=initial_value];
string my_name = “Moonin”;
1.8、结构体和联合体
System Verilog提供结构体(struct)和联合体(union),结构体中的成员被连续地存储,联合体的所有成员共享同一片存储空间,联合体中最大成员的空间。
通过packed关键字,构成压缩结构体。压缩结构体的所有成员在存储器中被无缝地压缩在一起,一个压缩体结构可以当做一个整体使用,第一个指定的成员为最高位,后续的成员以降序排列。
例子:

   //结构体实例
    typedef struct{
     bit [07:00] my_byte;
     int my_data;
     real p;
    }struct_t;
    initial begin
     struct_t.my_byte = 8'hff;
     struct_t = '{ff,10,3.5};
    end
    //自定义联合体实例
    typedef union{
     int i;
     shortreal f;
    }num;
    //自定义压缩结构体
    typedef struct packed{
     bit [07:00] my_byte;
      int my_data;
      real p;    
    }struct_t;

1.9、常量
System Verilog四种常量参数,parameter,localparam,specparam,const。
specparam延时参数只能在延时说明块中出现,只能定义延时参数。
例子:
parameter depth_array = 8;
localparam width = 8;
specparam delay = 10;
const logic flag = 1;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在SystemVerilog中,虽然它是一种硬件描述语言,但实际上可以和Python结合使用。这主要是因为SystemVerilog是一种功能强大的语言,可以用于设计和验证硬件。Python是一种通用的编程语言,具有强大的文本处理、数据分析和自动化能力。 在SystemVerilog中使用Python的主要目的是为了辅助设计和验证任务。例如,可以使用Python来处理和分析仿真输出文件,从中提取和验证关键参数。此外,Python还可以用于生成测试用例或配置文件,以便自动化测试流程。 要在SystemVerilog中使用Python,一种常见的方法是使用外部调用(External Call)的方式。通过使用SystemVerilog中的$system函数或$systemtask任务,可以从SystemVerilog中调用外部Python脚本,然后将结果返回到SystemVerilog中。 此外,还可以使用Verilog PLI(Programming Language Interface)来实现SystemVerilog和Python之间的交互。通过使用PLI,可以在SystemVerilog代码中嵌入Python函数,并通过PLI接口和SystemVerilog进行通信。 另外,Python还有一些库和工具可以与SystemVerilog配合使用。例如,可以使用pyvpi库来与Verilog的VPI(Verilog Procedural Interface)进行交互,使用cocotb库来编写Python测试框架,从而实现SystemVerilog代码的验证等等。 总而言之,SystemVerilog和Python的结合可以为硬件设计和验证流程提供更多的便利和灵活性。通过使用Python的文本处理、数据分析和自动化能力,可以提高设计和验证的效率,并实现更复杂的功能。 ### 回答2: System Verilog本身并不支持直接使用Python编程语言,因为它是一种硬件描述语言,主要用于硬件设计和验证。然而,在System Verilog中可以通过SVPython接口与Python进行交互,从而利用Python的强大功能。 SVPython接口是一种跨语言的接口,通过它,我们可以从System Verilog代码中调用Python函数,并传递参数或者获取返回值。这为System Verilog的用户提供了更多灵活性和功能扩展的可能性。 使用SVPython接口,我们可以在System Verilog中调用Python的标准库函数,如math、string等,或者调用第三方库进行数据处理、图像处理、机器学习等。例如,如果需要对System Verilog中的数据进行复杂运算或统计,可以调用Python的math库函数来完成。 另外,Python在机器学习和人工智能领域非常流行和强大。我们可以使用Python编写机器学习模型,并通过SVPython接口将其集成到System Verilog验证环境中。这样,我们可以利用机器学习技术来进行高级分析、自动化测试和优化。 总结来说,虽然System Verilog本身不支持直接使用Python,但通过SVPython接口,我们可以在System Verilog中调用Python的函数和库,从而利用Python的强大功能来增强System Verilog的设计和验证能力。这种集成可以提高开发效率,拓宽了System Verilog的应用范围。 ### 回答3: 在SystemVerilog中使用Python可以通过使用PLI(Programming Language Interface)实现。PLI是SystemVerilog提供的一种机制,允许开发者使用其他语言(如C++、Python等)与SystemVerilog交互。 首先,需要在SystemVerilog代码中添加`import "DPI-C" function`语句,以导入Python的函数。然后,可以使用`$dlopen(<library>)`函数加载Python库,并使用`$dlsym(<library>, <symbol>)`函数连接Python函数。 接下来,可以定义一个SystemVerilog的函数,并将其与Python函数进行绑定。如下所示: ```systemverilog import "DPI-C" function void my_python_function(); import "DPI-C" context python_function = begin initial $dlopen("my_python_module.so"); my_python_function = $dlsym("my_python_function"); end module my_module; initial begin my_python_function(); end endmodule ``` 在Python中,首先需要定义一个用于SystemVerilog调用的函数,并将其编译为动态链接库(.so文件)。可以使用`ctypes`库加载SystemVerilog中的函数,并与Python函数进行关联。 下面是一个Python的示例代码: ```python from ctypes import * # 定义SystemVerilog调用的函数 def my_python_function(): print("Hello from Python!") # 将Python函数编译为动态链接库 lib = CDLL("my_python_module.so") lib.my_python_function.restype = None lib.my_python_function.argtypes = [] # 将SystemVerilog函数与Python函数进行关联 lib.my_python_function() ``` 以上就是在SystemVerilog中使用Python的基本方法。通过PLI,可以实现SystemVerilog和Python之间的数据交互与函数调用。然而,需要注意的是,PLI通常与特定的编译器和操作系统密切相关,可能需要针对不同的平台进行调整和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰的FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值