关于结构体的内容

关于结构体的内容

结构体使用类似于C语言的语法来定义
结构体使用struct关键字声明。结构体内的成员可以是任何数据类型,包括用户自定义类型和其他的结构体类型。

struct{int a,b; //32位变量opcode_t opcode;//用户定义类型logic [23:0] adress;//24位变量bit error; // 一位两态变量
}Instruction_Word;

结构体是变量和/或常量的集合
结构体是一个名称下的变量和/或常量的集合。整个集合可以用结构体名进行引用。结构体内的每个成员也都有一个名称。它用来从结构体中选择成员。结构体成员与C语言中的引用方式相同。

<结构体名>.<变量名>
例如
Instruction_Word.adress = 32'hF000001E;

结构体可以是变量或线网
结构体不同于数组,数组是同类型同尺寸的元素集合,而结构体是不同类型和尺寸的变量和/或常量的集合。另外一个不同是数组元素是通过索引引用,而结构体成员通过的所有成员名称引用。

1、结构体的声明
变量和线网都可以定义为结构体
结构体是变量的集合,可以单独或者作为一个整体进行访问。作为整体时,结构体可以用var关键字声明为一个变量。结构体还可以使用任意Verilog线网类型如wire或tri定义为一个线网。当定义为线网类型时,结构体的所有成员必须都是四态类型的。

var struct{           //结构体声明logic [31 : 0 ] a,b;logic[7 : 0] opcode;logic[23 : 0] address;
}Instruction_Word_var;wire struct{           //结构体声明logic [31 : 0 ] a,b;logic[7 : 0] opcode;logic[23 : 0] address;
}Instruction_Word_var;

将结构体声明为变量或线网类型是可选择的。如果未指定,将整个结构体认为是一个变量。
注意,虽然结构体可以被声明为线网类型,但是结构体内不能使用线网类型。多个线网可以用SystemVerilog接口打包成一个组。

自定义和匿名的结构体
可以使用结构体来创建用户自定义数据类型,使用typedef关键字。将一个结构体声明为一个用户自定义类型不分配任何储存区。在声明为用户自定类型的结构体的成员赋值前,必须声明一个这种用户自定义类型的变量。

typedef struct{           //结构体定义logic [31 : 0 ] a,b;logic[7 : 0] opcode;logic[23 : 0] address;
}Instruction_Word_t;
Instruction_Word_t IW; //结构体分配储存区

如果结构体不用typedef声明,它会被当作匿名结构体引用。

 struct{           //结构体定义logic [31 : 0 ] a,b;logic[7 : 0] opcode;logic[23 : 0] address;
}Instruction;

局部和共享结构定义
自定义结构可在模块或接口内定义,在整个设计块中都可以使用。如果一个自定义结构体的定义需要在多个模块中,或作为模块或接口的端口使用,那么结构体定义应该放在包中,并导入到设计块或$unint编译单元域中。

2、结构体赋值
结构体可以使用值列表初始化
结构体在实例化的时候可以对其成员初始化。使用大括号’{}内的一组值,大括号之间的值必须与 成员的个数一致。

typedef struct{           //结构体定义logic [31 : 0 ] a,b;logic[7 : 0] opcode;logic[23 : 0] address;
}Instruction_Word_t;
Instruction_Word_t IW  = '{100,3,8'hFF,0}; //结构体分配储存区

定义结构体常数和结构体参数也使用类似的语法
注意:SystemVerilog数值列表语法不同于C语言

结构体成员赋值
通过引用结构体成员的名称可以对结构体的任意成员进行赋值。

typedef struct{           //结构体定义logic [31 : 0 ] a,b;logic[7 : 0] opcode;logic[23 : 0] address;
}Instr_t;
Instr_t IW; //结构体分配储存区always@(posedge clock ,negedge resetN)if(!resetN)beginIW.a = 100;//引用结构体成员IW.b = 5;IW.opcode = 8'hFF;IW.address = 0;endelsebegin....end

结构体表达式在’{}里面
整个结构体可以使用结构体表达式进行赋值。一个结构体表达式由’{}符号内用逗号隔开的一组值构成,跟结构体初始化一样。大括号内必须包含赋给每一个成员的值。

always@(posedge clock, negedge resetN)if(!resetN) IW = '{100,5,8'hFF,0};else begin...end

结构体表达式可以按照顺序或按成员名称列出
结构体表达式中的值可以按照它们在结构体中定义的顺序列出。或者,结构体表达式也可以指定被赋值的结构体成员名称,使用冒号成员名称和要赋的值。当指定成员名称时,表达式的顺序可以是任意顺序。

IW = '{adrress:0,opcode:8'hFF,a:100,b:5};

结构体的部分或全部成员可以被赋一个默认值。
结构体表达式可以通过指定默认值来指定多个成员为一个值。使用default关键字可以将结构体的所有成员指定为默认值。

IW = '{default,0};//设置IW的所有成员为0

使用数据类型的关键字也可以给结构体中特定的数据类指定默认值。default关键字和数据类型关键字使用冒号和其指定的值隔开。

typedef struct{           //结构体定义real r0,r1;int i0,i1;logic [7:0] opcode;logic [23:0] address;
}Instruction_word_t;
instruction_word_t IW;always(posedge clock,negedge resetN)if(!resetN)IW = '{real:1.0,default:0};//指定所有real类型的成员默认值1.0//指定其他成员默认值0elsebegin....end

赋给结构体成员的默认值必须与成员的数据类型兼容。也就是说这些值必须能够转换为成员的数据类型。
成员赋值还有一个优先级的问题。default关键字具有最低的优先级,可以被任意指定数据类型的默认值覆盖。指定数据类型的默认值又会被任意显性使用成员的赋值覆盖。

//赋给r0值1.0,r1值3.1415,结构体的其他成员被赋为0
typedef struct{           //结构体定义real r0,r1;int i0,i1;logic [7:0] opcode;logic [23:0] address;
}Instruction_word_t;
instruction_word_t IW;IW = '{real:1.0,default:0,r1:3.1415};

3、压缩和非压缩结构体
可以使用packed关键字显示地声明一个压缩结构体。压缩结构体按照指定的顺序以相邻的位来储存结构体成员。压缩结构体被当作一个向量储存,结构体的第一成员在向量的最左边。向量的最低位是结构体最后一个成员最低位,其位编号为0

struct packed{logic valid;logic [7:0] tag;logic [31:0] data;
}data_word;

在这里插入图片描述
压缩结构体的成员可以通过成员名引用,也可以使用结构体向量的相应位来引用。

data_word.tag = 8'hf0;
data_word[39:32] = 8'hf0;//同标识符相同的位

注意:压缩结构体只能包含整数值
压缩结构体必须包含压缩变量
压缩结构体的所有成员都必须是整数值。所谓整数值就是可以表示如byte、int这样的向量以及用bit或logic创建的向量值,如果结构体的任何一个成员不能用向量表示,那么结构体都不能被压缩。也就是说压缩结构体不能包含real或shortreal变量、非压缩结构体、非压缩联合体或非压缩数组。
压缩结构体的操作
压缩结构体被看做向量
由于压缩结构体以向量形式储存,对整个结构体的操作也是以向量的形式,因此对向量的算术操作、逻辑操作以及任何其他操作都可以用于压缩结构体。

typedef struct packed{logic valid;logic [7:0] tag;logic [31:0] data;
}data_word_t;
data_word_t packed_in,pack_out;always@(posedge clock)packed_out <= packet_in <<2;

注意,当把’{}符号的一系列值赋给压缩结构体时,列表中的值被赋予结构体的每一个成员,在这种情况下,压缩结构体来对待,而不是一个向量。’{}符号内的值是针对每一个结构体成员的分立值,而不是值的拼接。

有符号的压缩结构体
压缩结构体作为向量使用可以是有符号或者无符号的
压缩结构体可以使用关键字signed或unsigned来声明,这些修饰符影响到整个结构体在算术或相关的操作中,作为一个向量如何识别,但不影响到整个结构体的成员如何识别。结构体的每个成员是有符号的还是无符号,依赖于成员的类型声明。压缩结构体的部分选择始终是无符号的。

typedef struct packed signed{logic valid;logic [7:0] tag;logic [31:0] data;
}data_word_t;
data_word_t A,B;always@(posedge clock)if(A<B)  //有符号的比较...

4、通过端口传递结构体
端口可以被声明为结构体类型
结构体可以通过模块和接口的端口传递。结构体必须首先使用typedef定义为用户自定义数据类型,然后才允许将模块或接口的端口声明为结构体类型。

package definitions;
typedef enum{ADD,SUB,MULT,DIV}opcode_t;
typedef struct{logic[31:0] a,b;opcode_t opcode;logic [23:0] adress;logic error;
}instruction_word_t;
endpackagemodule alu
(input definitions::instruction_word_t IW,
inpput wire  clock);
...
endmodule

还要一种风格可以将包含typedef定义的包显示命名为模块端口定义的一部分,那就是将包导入到$unint编译单元声明域中。还可以在 $unint域中直接定义用户自定义类型。
当一个非压缩结构体通过模块端口传递时,端口两边连接的必须是同一种类型的结构体。在两个不同模块中声明的匿名结构体,即使它们具有相同的名称,同样的成员及名称,但它们并属于相同的结构体类型。
5、将结构体作为自变量传递至任务和函数
结构体可以传递给任务或者函数
结构体可以作为自变量传递至任务和函数。要做到这一点,必须首先使用typedef将结构体定义为用户自定义数据类型,这样任务和函数的自变量才可以声明为这种结构体的类型。

module processor(...);
...
typedef enum{ADD,SUB,MULT,DIV}opcode_t;
typedef struct{logic[31:0] a,b;opcode_t opcode;logic [23:0] adress;logic error;
}instruction_word_t;
function alu(input instruction_word_t IW);
...
endfunction
endmodule

当被调用任务或者函数具有非压缩结构体的形式变量时,必须传递完全相同类型的结构体给任务或函数。匿名的结构体,即使具有相同的成员和名称,也不是同种类型的结构体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pushing Policy Failed because Checkpoint Firewall “Load on module failed – no memory”

One day when pushing firewall policy from Checkpoint management server to UTM 272 cluster gateways, it failed and I got error message “Load on module failed – no memory” on one of cluster members. “Network Security Policy ‘Montreal_DMZ’ was prepared …

Point-BERT:一种基于Transformer架构的点云深度网络

目录 1. 前言 2. Point Tokenization 3. Transformer Backbone 4. Masked Point Modeling 5. Experiments Reference 1. 前言 从PointNet [1] 开始&#xff0c;点云深度网络逐渐成为解决点云特征提取与语义分析的主要研究方向。尤其在OpenAI的GPT模型获得了突破性成果后&#…

GNS3 VoIP Lab (Cisco 3725 and CME 4.3)

Here is a simple VoIP Lab in GNS3 environment. It is only used for my lab test and recorded here for future reference. 1. Topology: GNS3 Topology:Logic Topology:xp(192.168.2.60)——–C3725 Router(192.168.2.10) 2. Enviroment: ESXi 5.5 (or Vmware Workstation…

关于数组的内容

关于数组的内容 Verilog数组声明的基本语法 <data_type><vector_size><array_name><array_dimension> 例如&#xff1a; reg[15:0] RAM [0:4095];//储存器数组SystemVerilog允许任何数据类型的非压缩数组 SystemVerilog将非压缩数组的声明进行了扩展…

BreadCrumb控件

BreadCrumb控件&#xff0c;如上图所示&#xff0c;即面包屑导航控件&#xff0c;类似于TreeCtrl&#xff0c;但不是一次显示所有的Item&#xff0c;VC 2010可以编译通过&#xff0c;稍微修改一下其他的也可以编译&#xff0c;源代码下载&#xff1a; http://download.csdn.net…

Android简介

最近Android很火&#xff0c;小弟也想了解一下它的结构。跟CE或者Mobile比起来&#xff0c;它的结构是有点凌乱&#xff0c;也难怪&#xff0c;毕竟是基于别人的内核在上层开发了一些应用 ---------------------------------------------------------------------------------…

说不尽的刘恒

认识刘恒快三十年了&#xff0c;作为曾经的同事和他小说的责任编辑&#xff0c;我只写过他一篇文章&#xff0c;还是在二十多年前。有时候特别熟悉的人反而不知道从何写起&#xff0c;因为一想起往事&#xff0c;各种记忆像开闸的水一样涌满眼前&#xff0c;让人很难落笔。1985…

外行看Flash的存储原理

突然在网上看到别人两年前写的一篇关于nor和nand的好文章&#xff0c;做为csdn的合法公民&#xff0c;有必要转 一、存储数据的原理 两种闪存都是用三端器件作为存储单元&#xff0c;分别为源极、漏极和栅极&#xff0c;与场效应管的工作原理相同&#xff0c;主要是利用电场的…

快速计算整数的二进制表示法中1的个数

快速计算整数的二进制表示法中1的个数 题目&#xff1a;给定一个无符号32位整数x&#xff0c;求x的二进制表示法中含1的个数&#xff1f; 第一种算法&#xff1a; int OneCount(unsigned int x){ for(int count0; x>0; count) x&x-1;//把最后面的1变0 return …

在C/C++代码中使用SSE等指令集的指令(1)介绍

http://blog.csdn.net/gengshenghong/article/details/7007100我们知道&#xff0c;在C/C代码中&#xff0c;可以插入汇编代码提高性能。现在的指令集有了很多的高级指令&#xff0c;如果我们希望使用这些高级指令来实现一些高效的算法&#xff0c;就可以在代码中嵌入汇编&…

赋值操作符

赋值操作符 和其他赋值操作符 out in;//将out和in相加并将结果赋值给out //out out in;注意&#xff1a;这些操作符都是阻塞赋值packdage definitions;typedef enum logic[2:0] {ADD,SUB,MULT,DIV,SL.SR} opcode_t;typedef enum logic{UNSIGNED,SIGNED}operand_type_t;typ…

有无关通配符的相等操作符

有无关通配符的相等操作符 逻辑相等操作符 条件相等操作 SystemVerilog通配符相等操作符允许屏蔽某些位 SystemVerilog还增加了两个新的比较操作符&#xff1a; &#xff1f; 和&#xff01;&#xff1f;。这两个操作符允许在比较中屏蔽无关位。 操作符 &#xff1f;&#x…

cab文件介绍及制作方法

转自&#xff1a;http://bbs.pcpop.com/091030/5945399.html 1. 什么是cab文件 CAB在电脑上是一种压缩文件&#xff0c;微软出品的东西&#xff0c;用WinRAR可以解压缩&#xff0c;在DOS启动盘里面可以看见一些CAB压缩文件。其实Windows里面已经带了CAB压缩程序&#xff0c;但…

CVE-2015-0235: GHOST – A Critical Vulnerability in the Glibc Library

GHOST is a ‘buffer overflow’ bug affecting the gethostbyname() and gethostbyname2() function calls in the glibc library. If a remote attacker can make an application call to gethostbyname() or gethostbyname2(), this vulnerability allows the remote attack…

通过ap运行cab安装程序的方法及Sample Code

1. 第一部分&#xff1a;Sample Code 这部分转自&#xff1a;http://blog.csdn.net/hhygcy/archive/2009/05/04/4147870.aspx 最近这个东西很多被问及&#xff0c;软件动态升级的时候可能可以用到&#xff0c;在这里做一下记录。 就知道的方法有2个&#xff0c; 一个是通过Sh…

MFC透明桌面flash金鱼

代码&#xff1a; http://download.csdn.net/detail/hemmingway/6823935 使用方法&#xff1a; //0,添加left.png&#xff0c;right.png资源文件 //1, 头文件定义变量 GoldFish pet; //2, 在CPP文件创建 // Create a goldfishif (!pet.Create(NULL, NULL, WS_CHILD | WS_VISIB…

天才静之

木心说&#xff1a;“最高一层天才&#xff0c;是早熟而晚成的。”我一直认为静之就是一个天才。天才不同于才子&#xff0c;才子早熟&#xff0c;但往往短命&#xff0c;而静之却常胜不衰&#xff0c;愈“老”弥坚。 从诗歌、散文到小说&#xff0c;从电视剧、电影再到话剧、歌…

“象征界”的奇观:刘天怜花鸟工笔作品印象

有人说&#xff1a;“创新”是西洋画的基调&#xff0c;中国画的焦点是“承传”。就是说&#xff0c;西画必须花样翻新&#xff0c;挑战前人&#xff0c;甚至要推倒重来&#xff0c;唯此才可能在艺术史上占有一席之地&#xff1b;中国画强调以古人为师&#xff0c;重视师徒之间…

亚马逊正式发布关系型数据库Amazon Aurora

在去年的AWS re:Invent大会上&#xff0c;亚马逊宣布了Amazon Aurora。Aurora是一个关系型数据库&#xff0c;可以跨3个可用区域复制6份数据&#xff0c;其设计目标是提供高性能和高可用性&#xff08;99.99%&#xff09;&#xff0c;并且存储可以轻松高效地扩展到64TB。近日&a…

刘小东的“空城记”

刘小东的“空城记” 。从“三峡移民”到“金城小子”&#xff0c;从“温床”&#xff0c;再到"新疆和田 ”,今天&#xff0c;刘小东又把“鄂尔多斯” 纳入自己介入现实的创作计划。鄂尔多斯&#xff0c;一个中国曾经最贫瘠的所在&#xff0c;因为矿产开发&#xff0c;迅…