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

    文章

    5590

    浏览量

    129098
  • 数据
    +关注

    关注

    8

    文章

    7315

    浏览量

    93999
  • 硬件
    +关注

    关注

    11

    文章

    3556

    浏览量

    68751

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

    VirtualLab Fusion应用:Herriott池的建模

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

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

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

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

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

    VirtualLab应用:傅科刀口测试的建模

    建模任务 系统构建模块——抛物面镜 系统构建模块 – 球面镜 系统构建块 – 光阑 系统构建模块——理想准直透镜 系统中应用了理想化的透镜功能,以确保刀口后视场的准直。
    发表于 04-26 10:37

    基于VT系统的MCU硬件在环建模与仿真应用分析

    在新能源汽车行业快速发展的背景下,电机控制器(MCU)作为核心部件,其开发和测试的重要性日益增加。为了在开发早期阶段快速验证应用层算法功能及基础软件质量,硬件在环(HIL)测试技术应运而生。本文分析
    的头像 发表于 04-16 10:07 1111次阅读
    基于VT系统的MCU<b class='flag-5'>硬件</b>在环<b class='flag-5'>建模</b>与仿真应用分析

    概伦电子先进器件建模平台BSIMProPlus介绍

    BSIMProPlus是一款技术先进的半导体器件SPICE模型建模平台,在其多年的产品历史中一直保持在半导体行业SPICE建模市场和技术的领先地位,被众多集成电路制造和设计公司采用作为标准SPICE建模工具。
    的头像 发表于 04-16 09:03 1276次阅读
    概伦电子先进器件<b class='flag-5'>建模</b>平台BSIMProPlus介绍

    VirtualLab Fusion应用:渐变折射率(GRIN)镜头的建模

    摘要 折射率平滑变化的渐变折射率(GRIN)介质可用于例如:使镜头表面平坦或减少像差。 VirtualLab Fusion为光通过GRIN介质的传播提供了一种物理光学建模技术。在相同的速度下
    发表于 03-18 08:57

    VirtualLab Fusion应用:泰伯效应的建模

    Henry Fox Talbot的名字命名,他在1836年首次观察到了这种效应。在这个例子中,我们用快速物理光学软件VirtualLab Fusion演示了Talbot效应的建模(也再现了Talbot
    发表于 02-26 08:52

    VirtualLab Fusion案例:傅科刀口测试的建模

    建模任务 系统构建模块——抛物面镜 系统构建模块 – 球面镜 系统构建块 – 光阑 系统构建模块——理想准直透镜 系统中应用了理想化的透镜功能,以确保刀口后视场的准直。
    发表于 01-16 10:00

    VirtualLab:系统建模分析器

    ,系统建模分析器。本文档介绍该工具的使用方法。 系统建模分析器 如何运行建模分析器 系统建模分析器 例1:光束清理滤波器 示例 – 光束清理滤波器 光束清理滤波器 – 光源
    发表于 01-14 09:45

    AN-737: 如何用ADIsimADC完成ADC建模

    电子发烧友网站提供《AN-737: 如何用ADIsimADC完成ADC建模.pdf》资料免费下载
    发表于 01-13 14:54 1次下载
    AN-737: 如何用ADIsimADC完成ADC<b class='flag-5'>建模</b>

    VirtualLab Fusion:系统建模分析器

    ,系统建模分析器。本文档介绍该工具的使用方法 系统建模分析器 如何运行建模分析器 系统建模分析器 例1:光束清理滤波器 示例 – 光束清理滤波器 光束清理滤波器 – 光源 光
    发表于 01-04 08:45

    VirtualLab:系统建模分析器

    ,系统建模分析器。本文档介绍该工具的使用方法。 系统建模分析器 如何运行建模分析器 系统建模分析器 例1:光束清理滤波器 示例 – 光束清理滤波器 光束清理滤波器 – 光源
    发表于 12-19 12:36