SystemVerilog硬件设计及建模—第11章.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《SystemVerilog硬件设计及建模—第11章.ppt》由会员分享,可在线阅读,更多相关《SystemVerilog硬件设计及建模—第11章.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MicroElectronics Center5.1 结构体结构体提供了对相关信息进行分组的方法,结构体使用关键字struct声明,结构体内的成员可以是任何数据类型,包括用户自定义类型和其它的结构体类型;结构体是变量和常量的集合,整个集合可以用结构体名进行引用,也可以用结构体成员名来引用该成员。struct int a, b; opcode_t opcode; logic 31 : 0 address; bit error; instruction_word;结构体内的成员引用:Instruction_word.address = 32hf000001e;结构体与数组有什么不同?MicroEl
2、ectronics Center5.1.1 结构体声明变量或线网都可以定义为结构体,当结构体定义为线网时,结构体中所有成员必须都是四态类型的。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_net;struct logic 31 : 0 a, b; logic 7 : 0 opco
3、de; logic 23 : 0 address; instruction_word_var;Instruction_word_var是变量or线网类型?虽然结构体可以声明为线网类型,但结构体内成员不能使用线网类型!MicroElectronics Center5.1.1 结构体声明自定义和匿名结构体:typedef struct logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; instruction_word_t;instruction_word_t IW;struct logic 31 : 0 a, b; logic
4、 7 : 0 opcode; logic 23 : 0 address; instruction;自定义结构体可以在模块或接口内定义,在整个模块或接口中都可以使用,如果一个自定义结构体需要在多个模块中使用,或者是作为模块或接口的端口使用,那么结构体定义应放在package中!MicroElectronics Center5.1.2 结构体赋值结构体初始化:用值列表方式初始化,值列表是使用中的一组数值,大括号中的数值个数必须与成员个数一致。typedef struct logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; ins
5、truction_word_t;instruction_word_t IW = 100, 3, 8hff, 0; /大括号间的数值必须与成员个数一致MicroElectronics Center5.1.2 结构体赋值结构体成员赋值:typedef struct logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; instr_t;inst_t IW;always (posedge clk, negedge resetN) if (!resetN) begin IW.a = 100; IW.b = 100; IW.opcode
6、= 8hff; /成员引用 IW.address = 0; end else begin endMicroElectronics Center5.1.2 结构体赋值结构体成员赋值:always (posedge clk, negedge resetN) if (!resetN) IW = 100, 3, 8hff, 0; /结构体表达式赋值 else begin end/ IW = address : 0, opcode : 8hff, a : 100, b : 5;/ IW = address : 0, opcode : 8hff, 100, 5; /错误,混用成员名称 /和成员顺序IW =
7、 real : 1.0, default : 0;IW = real : 1.0, default : 0, r1 : 3.14;struct real r0, r1; int i0, i1; logic 7 : 0 opcode; logic 23 : 0 address; IW;MicroElectronics Center5.1.3 压缩和非压缩结构体默认情况下,结构体是非压缩的,也就是说,虽然结构体成员使用一个共同的名字,但它们被当作是独立的变量,压缩结构体用packed关键字显式说明,其特点是所有成员被当作一个向量存储,第一个成员在向量的最左边,最后一个成员在最低位,其编号为0 st
8、ruct packed logic valid; logic 7 : 0 tag; logic 31 : 0 data; data_word; valid tag data403931150压缩综合体中的成员只能是包含整数类型值:即可以表示为byte, int这样的向量 以及用bit或logic创建的向量!MicroElectronics Center5.1.3 压缩和非压缩结构体压缩结构体的操作:非压缩结构体的操作对压缩结构体一样适用,但压缩结构体还有与向量类似的操作,如算术操作、逻辑操作等 typedef struct packed logic valid; logic 7 : 0 tag
9、; logic 31 : 0 data; data_word_t; data_word_t packet_in, packet_out; always (posedge clk) packet_out = packet_in 2;MicroElectronics Center5.1.3 压缩和非压缩结构体有符号的压缩结构体:压缩结构体作为向量使用可以是有符号或无符号的,用关键字signed或unsigned来声明,但结构体中成员是有符号还是无符号的,只依赖于成员的类型声明,与结构体声明没有联系。压缩结构体的部分选择始终是无符号的。 typedef struct packed signed lo
10、gic valid; logic 7 : 0 tag; logic 31 : 0 data; data_word_t; data_word_t a, b; always (posedge clk) if (a b) /有符号比较 MicroElectronics Center5.1.4 通过端口传递结构体结构体可以通过模块和接口的端口传递 package definitions; typedef enum ADD, SUB, MULT, DIV opcode_t; typedef struct logic 31 : 0 a, b; opcode_t opcode; logic 23 : 0 a
11、ddress; logic error; instruction_word_t; endpackage import definitions : *; module alu (input instruction_word_t IW, input wire clk); endmodule在两个不同模块中声明的匿名结构体,即使它们具有相同的名称、同样的成员及名称,也不是相同的结构体!MicroElectronics Center5.1.5 将结构体作为任务和函数的自变量结构体可以作为自变量传递给任务和函数 module processor (); typedef enum ADD, SUB, MU
12、LT, DIV opcode_t typedef struct logic 31 : 0 a, b; opcode_t opcode; logic 23 : 0 address; logic error; instruction_word_t; function alu (input instruction_word_t IW); endfunction endmodule非压缩和压缩结构体都是可综合的,综合工具支持结构体通过模块端口、任务和函数传递,支持使用成员名和值的列表对结构体赋值!MicroElectronics Center5.2 联合体联合体只存储一个元素,但这个元素有多种表示方法
13、,每种表示可以是不同的数据类型。联合体与结构体的声明类似,其成员引用也一样union byte i; byte unsigned u; data;data.i = -5;$display(“data is %d”, data.i);data.u = -5;$display(“now data is %d”, data.u);typedef union int i; int unsigned u; data_t;data_t a, b;用户自定义和匿名联合体:区别在于是不是用typedef声明MicroElectronics Center5.2.1 非压缩联合体非压缩联合体可以包含任意变量类型,
14、如real类型,非压缩结构体和非压缩数组等;非压缩联合体不可综合,可用于对高层次系统和交易级建模;如果从非压缩联合体中读取的成员不同于上次写入的成员,可能导致不确定的结果!struct bit is_real; union int i; real r; value; data;/always (posedge write) begin case(operation_type) INT_OP : begin data.value.i = 5; data.value.r = 0; end FP_OP : begin data.value.r = 3.1415; data.is_real = 1;
15、end endcaseendalways (posedge real) begin if (data.is_real) real_opd = data.value.r; else int_opd = data.value.i;endMicroElectronics Center5.2.2 标签联合体标签联合体包含一个存储“标签”的隐含成员,代表存储数值的最后一个联合体成员的名称,使用标签表达式可以将一个值写入标签联合体中,标签表达式具有关键字tagged,后面是成员名,再后面是要存储的值;标签联合体检测联合体使用是否一致;使用标签表达式将值赋给标签联合体后,可以使用成员名将值写取联合体成员中,
16、如果指定的成员名与当前标签不匹配,将会产生错误。union tagged int i; real r; data; data = tagged i 5; /在data.i中存5,并设备隐含标签 d_out = data.i; /从联合体中读值 d_out = data.r; /错误:成员与联合的隐含标签不匹配 data.i = 7; /写到联合体成员中 data.r = 3.14; /?MicroElectronics Center5.2.3 压缩联合体压缩联合体声明方式与压缩结构体声明方式相同,在压缩联合体中,每个联合体成员的位数都必须是相同的,以保证压缩联合体使用同样的位数存储数据;压缩联
17、合体只能存储两态或四态类型的数据,因此,压缩联合体不能包含real或shortreal变量,或非压缩结构体、非压缩联合体、非压缩数组;压缩联合体允许数据以一种格式写入,而以另一种格式读取。 typedef struct packed logic 15 : 0 src_addr; logic 15 : 0dest_addr; logic 23 : 0 data; logic 7 : 0 opcode; data_packed_t; union packed data_packet_t packet; logic 7 : 07 :0 bytes; /压缩数组 dreg;MicroElectroni
18、cs Center5.2.3 压缩联合体 always (posedge clk, negedge resetn) if (!resetn) begin dreg.packet = 0; k = 0; end else if (load_data) begin dreg.bytesk = byte_in; k = k + 1; end always (posedge clk) if (data_ready) case (dreg.packet.opcode) src_addrdest_addrdataopcodebyte7byte6byte5byte4byte3byte2byte1byte06
19、34731706347311505539237MicroElectronics Center5.2.3 压缩联合体压缩的标签联合体:联合体可以声明为既是压缩的又是带标签的,此时联合体成员的位宽可以不同但还必须是两态或四态类型;压缩的标签联合体只允许从与上一个标签表达式写入到联合体中的成员相匹配的同一个成员中读值。 union tagged packed logic 15 : 0 short_word; logic 31 : 0 word; logic 63 : 0 long_word; data_word; data_word = tagged word 1;MicroElectronics
20、Center5.2.4 综合指导不管联合体有多少种数据类型表示方式,联合体只存储一个值,为了能够综合,首先要保证联合体中的成员数据类型为两态或四态的,其次是成员能以相同的位数存储,压缩联合体满足这种要求,因而,压缩联合体是可以综合的。MicroElectronics Center5.2.5 使用结构体和联合体举例建立一个可以进行有符号数和无符号数运算的ALU模型,两种计算不能同时进行。package definitions; typedef enum ADD, SUB, MULT, DIV, SL, SR) opcode_t; typedef enum UNSIGNED, SIGNED ope
21、rand_type_t; typedef union packed logic 31 : 0 u_data; logic signed 31 : 0 s_data; data_t; type struct packet opcode_t opc; operand_type_t op_type; data_t op_a; data_t op_b; instr_t;endpackageMicroElectronics Center5.2.5 使用结构体和联合体举例import definitions : *;module alu (input instr_t IW; output data_t a
22、lu_out); always (IW) begin if (IW.op_type = SIGNED) begin case (IW.opc) ADD : alu_out.s_data = IW.op_a.s_data + IW.op_b.s_data; SUB : alu_out.s_data = IW.op_a.s_data - IW.op_b.s_data; MULT : alu_out.s_data = IW.op_a.s_data * IW.op_b.s_data; DIV : alu_out.s_data = IW.op_a.s_data / IW.op_b.s_data; SL
23、: alu_out.s_data = IW.op_a.s_data 2; endcase endMicroElectronics Center5.2.5 使用结构体和联合体举例 else begin case (IW.opc) ADD : alu_out.u_data = IW.op_a.u_data + IW.op_b.u_data; SUB : alu_out.u_data = IW.op_a.u_data - IW.op_b.u_data; MULT : alu_out.u_data = IW.op_a.u_data * IW.op_b.u_data; DIV : alu_out.u_d
24、ata = IW.op_a.u_data / IW.op_b.u_data; SL : alu_out.u_data = IW.op_a.u_data 2; endcase end endendmoduleMicroElectronics Center5.3 数组Verilog-1995只允许声明一维的reg, integer和time数据类型的数组;Verilog-2001允许除了event类型外的所有变量或线网类型都可以用于数组声明,且允许声明多维数组;SystemVerilog允许任何数据类型用于声明数组,包括使用struct、enum以及用户自定义类型MicroElectronics
25、Center5.3.1 非压缩数组/1024个1位线网的一维非压缩数组wire n 0 : 1023;/256个8位变量的一维非压缩数组reg 7 : 0 lut 0 : 255;/1024个实数变量的一维非压缩数组real r 0 : 1024;/32位的整数变量的三维非压缩数组 integer i 7 : 0 3 : 0 7 : 0;wire 7 : 0 table 3 : 0; /如何存储?非压缩数组中各个数组元素是独立存储的!Verilog一次访问多个数组元素是错误的!MicroElectronics Center5.3.1 非压缩数组SystemVerilog支持的非压缩数组:bit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SystemVerilog 硬件 设计 建模 11
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内