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

    文章

    5343

    浏览量

    120368
  • 数据
    +关注

    关注

    8

    文章

    7030

    浏览量

    89035
  • 硬件
    +关注

    关注

    11

    文章

    3328

    浏览量

    66223

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

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

收藏 人收藏

    评论

    相关推荐

    VirtualLab:系统建模分析器

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

    VirtualLab Fusion应用:Herriott池的建模与仿真

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

    如何通过建模与仿真提升电力电子组件的设计与性能?

    建模过程被称为建模,而仿真被定义为使用模型研究实际或理论系统的行为和性能的过程。在仿真中,模型可以用于研究系统的现有或拟议特性。对于大型互联系统的仿真,建模方法被证明是非常有效的。这篇文章介绍了解
    的头像 发表于 11-25 11:35 219次阅读
    如何通过<b class='flag-5'>建模</b>与仿真提升电力电子组件的设计与性能?

    Matlab/Simulink/Stateflow建模开发及仿真测试

    matlab 模拟仿真 熟悉Matlab/Simulink/Stateflow建模开发及仿真测试,熟悉V模型开发流程。 熟悉自动代码生成,能够编写或者配置自动代码生成脚本。
    发表于 10-24 17:23

    使用C2000 MCU对用于数字控制的双向降压/升压转换器进行建模

    电子发烧友网站提供《使用C2000 MCU对用于数字控制的双向降压/升压转换器进行建模.pdf》资料免费下载
    发表于 10-12 11:48 0次下载
    使用C2000 MCU对用于<b class='flag-5'>数字</b>控制的双向降压/升压转换器进行<b class='flag-5'>建模</b>

    知识分享 | 轻松实现优质建模

    知识分享在知识分享栏目中,我们会定期与读者分享来自MES模赛思的基于模型的软件开发相关Know-How干货,关注公众号,随时掌握基于模型的软件设计的技术知识。轻松实现优质建模前言在基于模型的开发
    的头像 发表于 09-12 08:08 404次阅读
    知识分享 | 轻松实现优质<b class='flag-5'>建模</b>

    英特尔软硬件建模块如何帮助优化RAG应用

    硬件建模块如何帮助优化RAG应用,在简化部署和支持扩展的同时,增强其上下文感知能力和实时响应性能。 1 为您的应用量身定制GenAI ChatGPT的面世改变了AI的发展格局。企业争相利用这项新技术
    的头像 发表于 07-24 15:12 429次阅读
    英特尔软<b class='flag-5'>硬件</b>构<b class='flag-5'>建模</b>块如何帮助优化RAG应用

    Python建模算法与应用

    Python作为一种功能强大、免费、开源且面向对象的编程语言,在科学计算、数学建模、数据分析等领域展现出了卓越的性能。其简洁的语法、对动态输入的支持以及解释性语言的本质,使得Python在多个平台
    的头像 发表于 07-24 10:41 554次阅读

    三维可视化建筑建模特点

    三维可视化建筑建模是一种利用计算机技术对建筑物进行立体化表达和展示的过程,是建筑设计和规划中不可或缺的重要环节。在当今数字化时代,三维可视化建模已经成为建筑设计和规划中的常规操作,其特点主要表现
    的头像 发表于 07-23 11:50 523次阅读

    cad如何进行三维建模

    三维建模是计算机辅助设计(CAD)中的一项重要技术,它可以帮助设计师在计算机上创建和编辑三维模型。本文将介绍如何使用CAD软件进行三维建模,包括建模的基本步骤、建模技巧和注意事项等。
    的头像 发表于 07-09 10:23 916次阅读

    神经网络在数学建模中的应用

    数学建模是一种利用数学方法和工具来描述和分析现实世界问题的过程。神经网络是一种模拟人脑神经元结构和功能的计算模型,可以用于解决各种复杂问题。在数学建模中,神经网络可以作为一种有效的工具,帮助我们更好
    的头像 发表于 07-02 11:29 947次阅读

    隧道BIM如何设计和建模

    隧道BIM (Building Information Modeling)是一种在隧道设计、建造和管理过程中使用数字化模型的方法。通过BIM技术,设计师、工程师和建造者可以在一个统一的平台上共享信息
    的头像 发表于 06-04 15:54 389次阅读

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

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

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

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

    gis建模与空间分析的区别

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