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

    文章

    5620

    浏览量

    130443
  • 数据
    +关注

    关注

    8

    文章

    7349

    浏览量

    95041
  • 硬件
    +关注

    关注

    13

    文章

    3638

    浏览量

    69174

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    [VirtualLab] 真实结构下的目镜混合衍射透镜的效果建模

    摘要 具有折射表面和衍射表面的混合透镜在不同应用中已成为一种很有前途的解决方案。在这里,我们展示了一个混合目镜的例子,其中一个用真实表面建模的衍射透镜被用来纠正色差。利用局部线性光栅近似(LLGA
    发表于 04-29 08:25

    探索Microchip数字电源入门套件:功能、硬件与应用全解析

    探索Microchip数字电源入门套件:功能、硬件与应用全解析 在当今电子技术飞速发展的时代,数字电源技术凭借其高效、灵活和智能的特点,正逐渐成为电源设计领域的主流趋势。Microchip的
    的头像 发表于 04-06 16:40 1113次阅读

    【分享】告别盲目建模!Simcenter Simlab PCB建模的6大高效策略,助您事半功倍!

    。如何在保留关键物理特性的前提下,实现大规模数组的快速运算。从传统的均质化材料到精细的3D细节建模,选择合适的建模策略(ModelingStrategy)不仅关乎精
    的头像 发表于 04-02 10:21 168次阅读
    【分享】告别盲目<b class='flag-5'>建模</b>!Simcenter Simlab PCB<b class='flag-5'>建模</b>的6大高效策略,助您事半功倍!

    VirtualLab:泰伯效应的建模

    VirtualLab:泰伯效应的建模
    的头像 发表于 03-18 16:59 118次阅读
    VirtualLab:泰伯效应的<b class='flag-5'>建模</b>

    飞腾主板和龙芯主板成为数字时代发展的坚实硬件

    数字浪潮席卷千行百业,从智能制造的无人车间到智慧交通的调度中枢,从能源监控的远程终端到政务服务的自助设备,每一个数字化场景的稳定运行,都离不开核心硬件的支撑。
    的头像 发表于 01-05 11:41 361次阅读
    飞腾主板和龙芯主板成为<b class='flag-5'>数字</b>时代发展的坚实<b class='flag-5'>硬件</b>

    技术资讯 I 多板系统 3D 建模,提升设计精度和性能

    本文要点了解3D建模流程。洞悉多板系统3D建模如何提高设计精度、性能和成本效益。掌握3D建模在制造工艺中的优势。在PCBA领域,仿真与建模是实现精准高效设计的基石。在量产前构建并复用原
    的头像 发表于 11-21 17:45 2672次阅读
    技术资讯 I 多板系统 3D <b class='flag-5'>建模</b>,提升设计精度和性能

    雷达系统中数字下变频的实现

    本次设计同样是通过在simulink搭建模型并通过matlab仿真得到正确设计后生成IP核的形式来实现数字下变频的功能。
    的头像 发表于 08-30 14:29 1570次阅读
    雷达系统中<b class='flag-5'>数字</b>下变频的实现

    如何利用三维建模加速FCB-CR8530的定制化开发?案例与工具详解

    领域。然而,传统开发流程中,硬件设计、结构验证与软件调试往往需要多次迭代,导致周期长、成本高。三维建模技术的引入,为FCB-CR8530的定制化开发提供了全新路径,通过数字化仿真与快速验证,显著提升了开发效率。 一、三维
    的头像 发表于 07-22 16:14 711次阅读

    行业案例:杰和科技为智慧教育构建数字硬件底座

    杰和科技以桌面云终端、数字媒体播放器、SDM模组和工业主板为硬件支撑,数字化信息管理和边缘存储管理等软件技术为辅,构建智慧教育数字化底座,帮助客户完成智慧教育升级改造,满足各场景下的用
    的头像 发表于 07-17 13:36 607次阅读
    行业案例:杰和科技为智慧教育构建<b class='flag-5'>数字</b>化<b class='flag-5'>硬件</b>底座

    Simcenter STAR-CCM+多相CFD仿真:自信对复杂的工业多相应用精确建模

    优势对复杂的工业多相系统进行建模,无需进行广泛的几何体简化以高保真度进行多相应用仿真使用基于可用资源的出色多相建模技术获得精确结果摘要在实现可持续未来的激烈竞争中,新产品设计必须考虑到环境
    的头像 发表于 06-18 15:32 1244次阅读
    Simcenter STAR-CCM+多相CFD仿真:自信对复杂的工业多相应用精确<b class='flag-5'>建模</b>

    VirtualLab Fusion应用:多反射系统的非序列建模

    非序列光学系统,特别是那些非序列性来自组件内部多次内部反射的系统,具有一系列特定的挑战。将这样的系统分解成一个顺序等价的系统通常非常不方便,而且总是不切实际的。因此,拥有一个稳定的非序列建模策略
    发表于 06-12 08:49

    VirtualLab Fusion应用:Herriott池的建模

    。Herriott单元是这种系统的一个例子,其特点是使用两个球面反射镜,在其中一个球面反射镜上钻一个离轴孔,以允许光束进出。镜子的曲率改变了光束的方向并控制了它的发散。在此用例中,我们用光学建模和设计软件
    发表于 06-11 08:52

    利用MATLAB对交流电机调速系统进行建模和仿真

    是借助计算机及相关技术,对真实系统的运行过程和状态进行数字化模拟的技术。Simulink作为MATLAB的一个组件,能够实现对动态系统的建模、仿真和综合分析。本文在Simulink环境中建立面向电气
    发表于 06-06 14:31

    SOLIDWORKS建模秘籍——必学的五个草图与建模技巧

    SOLIDWORKS作为一款功能强大的三维CAD软件,广泛应用于各种设计和产品开发领域。掌握SOLIDWORKS的草图与建模技巧,能够显著提升设计效率,减少错误,并快速将创意转化为现实。以下是五个必学的SOLIDWORKS草图与建模技巧,帮助你成为设计高手。
    的头像 发表于 05-26 13:17 1456次阅读
    SOLIDWORKS<b class='flag-5'>建模</b>秘籍——必学的五个草图与<b class='flag-5'>建模</b>技巧

    索尼FCB-ER8530:三维建模与视觉感知的跨界融合

    数字化浪潮中,三维建模技术正重塑工业设计、文化遗产保护与智慧城市管理等领域,而索尼FCB-ER8530一体化摄像机模组凭借其4K超高清成像与智能感知能力,成为这一进程中的关键硬件支撑。 三维
    的头像 发表于 05-19 17:30 738次阅读