SystemVerilog结构体

作者&投稿:大叔康 (若有异议请与网页底部的电邮联系)
~

本文所有源码可通过后台回复 “结构体”获得

结构体由关键字 struct 声明,且结构体中的成员可以是任何数据类型

如下定义一个结构体:

结构体就如同一个集合,集合中包含各种变量和常量,并且这些变量和常量可以用结构体名进行引用,引用方式为 <结构体名>.<变量名>

如果要用到上面定义的结构体中的变量c,可以这样引用 Instruction_Word.c

结构体也可以整体显示声明为变量整体或者线网整体

结构体整体可以声明为线网类型,但结构体内部不能使用线网类型

像上面这个例子,我们把结构体名定义的比较长,每次引用结构体内的变量,会显得冗长,这里可以利用 typedef 将结构体声明为用户自定义类型

这里有两点需要说明

可以在实例化结构体时对内部的变量进行初始化,方法是用 '{} ,大括号里的 数值个数及次序必须与成员个数及次数一致

看个例子

运行结果如下

注意:大括号前的符号是 英文的单撇号

刚开始以为是Esc键下面的那个按键,结果就运行失败了

尝试一下在实例化的时候删除一个赋值

看看编译会出现什么情况

看来赋值时的个数确实要与结构体内部变量的个数一致

如果我们一时间只想改变结构体中某个成员的值,可以单独给这个成员赋值

就像上面这个例子,在初始化后,我们只想改变变量 flag 的值,可以这样

从运行结果中可以看到,初始化时flag为0,通过单独给flag赋值后,变为1

结构体表达式赋值与初始化类似

有两种形式

我们试试两种方式赋值是否都可行

可见两种方式都可行!

那么这两种方式能不能混合使用呢?

我们在显示后面再加两句

运行结果显示 不能混合使用

结构体表达式的方式是不是类似于Verilog中module的调用,分为按位置调用和按名称调用,只不过不能有缺省

关键字 default 可以将结构体的所有成员指定为默认值,像这样 '{default:0}

可以看到运行结果均为对应位宽的默认数值

优先级排序:default赋值 < 数据类型赋值 < 成员名称赋值

优先级高的赋值会覆盖掉优先级低的赋值

用一个例子测试一下

可以看到,最终输出的结果是 成员名赋值 的结果,因为按成员名称赋值的优先级最高

压缩结构体就像一个向量,所有的成员都是向量中的元素,成员按照在结构体中的顺序,依次是向量的高位和低位

比如下面这个压缩结构体:

按照压缩变量的说法, title, middle, endle 会组成一个向量,其顺序如下

为了验证这一点,同样做一个小测试

从结果中可以看到, title 是高四位, middle 是中间位, endle 是低两位,与上述吻合

有一点需要注意,这里是 packed 不是定义包的那个 package ,并且顺序不能搞错,一定是 struct packed ,而不是 packed struct

像上面例子中定义的结构体,可以改为 struct packed singed 便是有符号的压缩结构体

本文主要参考《SystemVerilog硬件设计及建模》




verilog 怎么对 寄存器组 赋初值
一般这样的寄存器初始化都在复位时候:always@(poesdge clk or negedge N_rst)begin if(!N_rst)begin lut[ 1 ]< = 8'd52;lut[ 2 ] <= 8'd1;……end else ……end

verilog:error(10773)
ERROR:HDLCompilers:26 - "baidu.v" line 3 expecting ';', found '['ERROR:HDLCompilers:27 - "baidu.v" line 4 Illegal redeclaration of 'led'这是ISE下的报错。问题已经很明显了,你的这种定义方式软件根本不认……第三行软件认为定义输出变量后就应该分号结束,你却又加了一个【0:7】,...

sv工程是什么意思?
SV工程是指SystemVerilog工程,是基于Verilog的硬件描述语言(HDL)的扩展。它提供了一些新特性如OO(面向对象)编程、类的继承、封装和多态性。与传统Verilog不同,SystemVerilog包括了许多与设计验证相关的语言特性,如断言、函数等。此外,SV还增强了模块和端口的声明以及参数化模块实例化等语法细节,从而更...

延平区17830724349: 请教System Verilog中的结构体要怎么使用才可以看波形 -
储柱生血: 在菜单栏中选择“compile-->compile options”,然后选择system verilog就行了 如果你使用命令方式编译的话 那么使用 vlog -sv test.v 或者vlog test.sv

延平区17830724349: 想问一下verilog语言有没有struct结构体描述方法 -
储柱生血: 没有,但在 system verilog中有

延平区17830724349: verilog能否通过宏定义得到一个结构体 -
储柱生血: parameter [1:0] MOD1 = 2'b00; parameter [1:0] MOD2 = 2'b11; parameter [1:0] CONFIG = MOD1; assign A = CONFIG[1]; assign B = CONFIG[0]

延平区17830724349: systemverilog设计哪方面的,学习要具备哪方面的基础知识啊 -
储柱生血: 你要学SV的话,要确保你首先VerilogHDL语言要有一定功底,如果你VerilogHDL很熟,那其实SV并不难,如果说VerilogHDL等同于C语言的话,那么SV就等同于C++. 再者就是要看你学习SV时选择的方向,是测试方向还是综合方向,我用SV...

延平区17830724349: Verilog如何在一个结构体中用两个进程 -
储柱生血: assign z= sel ? a : b; 意思是: if (sel = 1), z = a else if (sel=0), z =b

延平区17830724349: verilog 中 dut是什么意思,还有模块调用的语法问题 -
储柱生血: 这里的dut是什么语法?是只要在测试的时候,模块名后面都要加这个么? dut: device under test.这个只是表示你要调用单元的例化名而已,此名字可以改成任何verilog可识别的字符. 同理,U_CTRL_SHIFT也是你调用模块ctrl_shift时自己定义的例化名. 希望对你有点帮助. 你在网上查查verilog 模块调用语法,信息多得很.另夏宇闻写的语法书上也有.

延平区17830724349: verilog 语句中有一个英文的点是什么意思 例如.rst(rst), 这个.是什么意思? -
储柱生血: 这只是Verilog中例化两种方式的一种而已. 举个例子: 有一个模块A module A(rst, clk, data……);要想例化它,你可以 (1) A U_A1(U_A1_rst, U_A1_clk, U_A1_data...); 在这种写法,U_A1端口列表与A的必须严格对应,也就是说,模块...

延平区17830724349: verilog结构描述法——对于总线形式,只想引出其中的几个管脚该怎样写?
储柱生血: 你是调用Y,那么只能全引出来再截取

延平区17830724349: 怎样在systemverilog DPI中调用SV,C与C++ -
储柱生血: 网上有些例子只给了简单的print,文档里也只有在module中调用c,c中用module的函数,不能充分说明问题.既然希望在C里调用C++的函数,那么肯定要能访问到C++类里的变量那才有意义.这里给出一个简单的例子,示例代码如下:调用关系...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网