0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数字硬件建模SystemVerilog

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-07-14 09:05 次阅读

数字硬件建模SystemVerilog-使用结构体和联合体的例子

使用结构体和联合体的例子

结构体和联合体可以包括压缩或非压缩数组,压缩结构体或联合体只能包括压缩数组。

9f480000-030d-11ed-ba43-dac502259ad0.png

压缩和非压缩的数组可以将结构体和联合体作为元素包含在数组中。在压缩数组中,结构体或联合体也必须是压缩的。

9f6813fe-030d-11ed-ba43-dac502259ad0.png

数组可以包含自定义结构体和自定义联合体。综合支持数组中的压缩或非压缩结构体。

示例4-8说明了如何使用结构体数组,该示例是一个指令寄存器模型,其中包含32条指令的非压缩数组,每条指令是一个复合值,表示为压缩结构体。指令中的操作数可以是有符号的或无符号的,表示为两种类型的联合体。

该指令寄存器的输入包括单独的操作数、一个操作码和一个指示操作数是有符号的还是无符号的标志。该模型将这些单独的输入值加载到指令寄存器阵列中。一种写入指针输入控件,用于加载数据。该模型的输出是单个指令结构体,使用读指针输入从指令寄存器中选择。

本例使用了前面示例4-6中所示的相同包项。

示例4-6:包含结构体和联合体定义的包

//
//Packagewithunionandstructuredefinitions
//
//`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
`define_4bit//use4-bitdatafortestingsynthesis
//`define_32bit//use32-bitdatawordsize
//`define_64bit//use64-bitdatawordsize
packagedefinitions_pkg;
`ifdef_4bit
typedeflogic[3:0]uword_t;
typedeflogicsigned[3:0]sword_t;
`elsif_64bit
typedeflogic[63:0]uword_t;
typedeflogicsigned[63:0]sword_t;
`else//defaultis32-bitvectors
typedeflogic[31:0]uword_t;
typedeflogicsigned[31:0]sword_t;
`endif

typedefenumlogic[2:0]{ADD,SUB,MULT,DIV}op_t;
typedefenumlogic{UNSIGNED,SIGNED}operand_type_t;

//Packedunionrepresentsavariablethatcanstore
//differenttypes
typedefunionpacked{
uword_tu_data;
sword_ts_data;
}data_t;

//Packedstructurerepresentsacollectionofvariables
//thatcanreferencedandpassedthroughportsasagroup
typedefstructpacked{
op_topcode;
operand_type_top_type;
data_top_a;
data_top_b;
}instruction_t;
endpackage:definitions_pkg
//`end_keywords
示例4-8:使用结构体数组对指令寄存器建模
//`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
moduleinstruction_register
importdefinitions_pkg::*;//wildcardimportthepackage
(inputlogicclk,rstN,load_en,
inputdata_top_a,
inputdata_top_b,
inputoperand_type_top_type,
inputop_topcode,
inputlogic[4:0]write_pointer,
inputlogic[4:0]read_pointer,
outputinstruction_tiw
);
timeunit1ns;timeprecision1ns;

instruction_tiw_reg[0:31];//arrayofstructures

//writetotheregisterarray
always_ff@(posedgeclkornegedgerstN)//asyncreset
if(!rstN)begin//active-lowreset
foreach(iw_reg[i])
iw_reg[i]<= '{opcode:ADD,default:0}; // reset values
   end 
   else if (load_en) begin 
     case (op_type)
       SIGNED:   iw_reg[write_pointer] <= 
                   '{opcode,op_type,op_a.s_data,op_b.s_data};
       UNSIGNED: iw_reg[write_pointer] <=
                   '{opcode,op_type,op_a.u_data,op_b.u_data};
     endcase 
   end 
 // read from the register array
 assign iw = iw_reg[read_pointer];

endmodule: instruction_register
//`end_keywords 

图4-5显示了综合该示例的结果。说明了如何使用结构体和联合体、数组来建模大量设计功能,只需很少的代码。示意图右上角的矩形符号是综合编译器选择报告的通用RAM的实例(在RTL模型中数组的存储。)综合编译器将在综合的最后一步将该通用RAM作为一个或多个同步存储设备来实现,其中通用门级功能映射到特定的ASICFPGA设备。

图4-5:示例4-8的综合结果:带结构体的指令寄存器 9f773e92-030d-11ed-ba43-dac502259ad0.png

附录-TestBench

//`begin_keywords"1800-2012"
moduletest
importdefinitions_pkg::*;
(inputlogictest_clk,
outputlogicload_en,
outputlogicrstN,
outputdata_top_a,
outputdata_top_b,
outputop_topcode,
outputoperand_type_top_type,
outputlogic[4:0]write_pointer,
outputlogic[4:0]read_pointer,
inputinstruction_tiw
);

timeunit1ns;timeprecision1ns;

intseed=555;

initialbegin
$display("
Resetingtheinstructionregister...");
write_pointer=5'h00;//initializewritepointer
read_pointer=5'h1F;//initializereadpointer
load_en=1'b0;//initializeloadcontrolline
rstN<= 1'b0;            // assert rstN (active low)
    repeat (2) @(posedge test_clk) ;  // hold in reset for 2 clk cycles
    rstN           = 1'b1;            // deassert reset_n (active low)

    $display("
Writing values to register stack...");
    op_type     = SIGNED;
    op_a.s_data =  3;
    op_b.s_data = -5;
    opcode      = ADD;
    load_en     = 1'b1;  // enable writing to register
    @(posedge test_clk) ;
    for (int i=0; i<=2; i++) begin
      write_pointer = i;
      $display("Writing to register location %0d: ", write_pointer);
      $display("  opcode = %0d (%s)", opcode, opcode.name);
      $display("  op_type = %0d (%s)", op_type, op_type.name);
      if (op_type == SIGNED) begin
        $display("  op_a.s_data = %0d",   op_a.s_data);
        $display("  op_b.s_data = %0d
", op_b.s_data);
      end else begin
        $display("  op_a.s_data = %0d",   op_a.u_data);
        $display("  op_b.s_data = %0d
", op_b.u_data);
      end
      @(negedge test_clk) ;
      op_a++;
      op_b--;
      opcode = op_t'(opcode + 1);
      op_type = op_type.next;
    end
    load_en = 1'b0;  // turn-off writing to register

    // read back and display same three register locations
    $display("
Reading back the same register locations written...");
    for (int i=0; i<=2; i++) begin
      @(posedge test_clk) read_pointer = i;
      @(negedge test_clk) ;
      $display("Read from register location %0d: ", read_pointer);
      $display("  iw.opcode = %0d (%s)", iw.opcode, iw.opcode.name);
      $display("  iw.op_type = %0d (%s)", iw.op_type, iw.op_type.name);
      if (iw.op_type == SIGNED) begin
        $display("  iw.op_a.s_data = %0d",   iw.op_a.s_data);
        $display("  iw.op_b.s_data = %0d
", iw.op_b.s_data);
      end else begin
        $display("  iw.op_a.s_data = %0d",   iw.op_a.u_data);
        $display("  iw.op_b.s_data = %0d
", iw.op_b.u_data);
      end
    end
    @(posedge test_clk) $finish;
  end
endmodule: test

module top;
  timeunit 1ns; timeprecision 1ns;

  import definitions_pkg::*;

  logic          clk;
  logic          test_clk;
  logic          rstN;
  logic          load_en;
  logic          reset_n;
  op_t           opcode;
  operand_type_t op_type;
  data_t         op_a, op_b;
  logic [4:0]    write_pointer, read_pointer;
  instruction_t  iw;

  test                 test (.*);
  instruction_register dut  (.*);

  initial begin
    clk <= 0;
    forever #5  clk = ~clk;
  end

  initial begin
    test_clk <=0;
    // offset test_clk edges from clk to prevent races between
    // the testbench and the design
    #4 forever begin
      #2ns test_clk = 1'b1;
      #8ns test_clk = 1'b0;
    end
  end
endmodule: top
//`end_keywords


9f9e21a6-030d-11ed-ba43-dac502259ad0.jpg

SystemVerilog-联合体(union)

9fb5691a-030d-11ed-ba43-dac502259ad0.jpg

SystemVerilog-结构体(二)

9fc124b2-030d-11ed-ba43-dac502259ad0.jpg

原文标题:SystemVerilog-使用结构体和联合体的例子

文章出处:【微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5249

    浏览量

    119140
  • 数据
    +关注

    关注

    8

    文章

    6702

    浏览量

    88274
  • 硬件
    +关注

    关注

    11

    文章

    3099

    浏览量

    65817

原文标题:SystemVerilog-使用结构体和联合体的例子

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    IEEE 1800-2023 SystemVerilog新版本正式发布了!

    2024年3月初,在美国硅谷举办的DVCon2024上,IEEE-SA和Accellera联合宣布通过IEEE Get Program可以免费获取IEEE 1800-2023 SystemVerilog语言参考手册。
    的头像 发表于 03-20 13:52 1237次阅读

    在Vivado Synthesis中怎么使用SystemVerilog接口连接逻辑呢?

    SystemVerilog 接口的开发旨在让设计中层级之间的连接变得更加轻松容易。 您可以把这类接口看作是多个模块共有的引脚集合。
    的头像 发表于 03-04 15:25 731次阅读
    在Vivado Synthesis中怎么使用<b class='flag-5'>SystemVerilog</b>接口连接逻辑呢?

    gis建模与空间分析的区别

    进行比较和解析。 首先,GIS建模是指将现实世界的地理实体和现象通过计算机技术和方法表达出来,用数字化的方式模拟、描述和分析。GIS建模可以分为两个方面,即地理数据模型和地理过程模型。地理数据模型是指通过特定的数据结构和模型来
    的头像 发表于 02-25 14:57 703次阅读

    分享一些SystemVerilog的coding guideline

    本文分享一些SystemVerilog的coding guideline。
    的头像 发表于 11-22 09:17 563次阅读
    分享一些<b class='flag-5'>SystemVerilog</b>的coding  guideline

    数字IC前端设计+后端设计流程实现

    RTL 设计** :芯片功能设计。硬件描述语言如 Verilog、VHDL、SystemVerilog
    的头像 发表于 11-08 15:03 3415次阅读
    <b class='flag-5'>数字</b>IC前端设计+后端设计流程实现

    ESL事务级建模语言简介

    任何系统级建模语言,都需要具备在较高层次的抽象能力和对不同来源的IP的集成能力。建模方法的选择通常基于语言熟悉程度、建模支持、模型可用性和简单性。 在各种软硬件描述语言中,Verilo
    的头像 发表于 11-02 15:10 565次阅读

    ESL设计的核心——事务级建模介绍

    设计、软硬件划分、软硬件协同设计和验证,都离不开事务级建模。 在系统级的设计中,首先要解决的问题是如何描述系统也就是所谓系统建模。在当前的集成电路设计中,算法层次上建立的功能模型(AL
    的头像 发表于 11-02 14:38 1018次阅读

    SystemVerilog相比于Verilog的优势

    我们再从对可综合代码的支持角度看看SystemVerilog相比于Verilog的优势。针对硬件设计,SystemVerilog引入了三种进程always_ff,always_comb
    的头像 发表于 10-26 10:05 692次阅读
    <b class='flag-5'>SystemVerilog</b>相比于Verilog的优势

    systemverilog:logic比reg更有优势

    systemverilog协议中,logic定义四态值,即向量(vector)的每个位(bit)可以是逻辑0, 1, Z或X,与verilog协议中的reg很接近。但是logic有个很明显的优势,不允许多驱动。
    的头像 发表于 10-26 09:32 791次阅读
    <b class='flag-5'>systemverilog</b>:logic比reg更有优势

    SystemVerilog硬件设计部分有哪些优势

    Language,硬件描述语言),而SystemVerilog则是HDVL(Hardware Design and Verification Language,硬件设计与验证语言)。由此可见,
    的头像 发表于 10-19 11:19 927次阅读
    <b class='flag-5'>SystemVerilog</b>在<b class='flag-5'>硬件</b>设计部分有哪些优势

    SystemVerilog:处理信号双驱动问题解析

    SystemVerilog中,类型可以分为线网(net)和变量(variable)。线网的赋值设定与Verilog的要求相同,即线网赋值需要使用连续赋值语句(assign),而不应该出现在过程块(initial/always)中。
    的头像 发表于 10-13 14:53 1700次阅读
    <b class='flag-5'>SystemVerilog</b>:处理信号双驱动问题解析

    SystemVerilog中的联合(union)介绍

    SystemVerilog 中,联合只是信号,可通过不同名称和纵横比来加以引用。
    的头像 发表于 10-08 15:45 1070次阅读
    <b class='flag-5'>SystemVerilog</b>中的联合(union)介绍

    systemverilog:logic比reg更有优势?

    systemverilog协议中,logic定义四态值,即向量(vector)的每个位(bit)可以是逻辑0, 1, Z或X,与verilog协议中的reg很接近。但是logic有个很明显的优势,不允许多驱动。
    的头像 发表于 09-28 17:34 2280次阅读
    <b class='flag-5'>systemverilog</b>:logic比reg更有优势?

    SystemVerilog的随机约束方法

    上一篇文章《暗藏玄机的SV随机化》介绍了SystemVerilog的各种随机化方法,本文将在其基础上引入SystemVerilog的随机约束方法(constraints)。通过使用随机约束,我们可以将随机限制在一定的空间内,有针对性地提高功能覆盖率。
    的头像 发表于 09-24 12:15 1170次阅读

    射频功放的建模资料

    随着通信技术的发展,射频电路在通信系统中得到了广泛的应用。功率放大器的研究和设计一直是通信发展中的重要课题。近年来,基于模糊神经网络的射频器件和电路建模的研究取得了巨大的成果,对大规模集成电路和复杂电路的建模有着巨大的启发意义, 成为当今研究的热点之一,本文将基于这个理论
    发表于 09-22 07:22