0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)字硬件建模SystemVerilog

OpenFPGA ? 來源:OpenFPGA ? 作者:OpenFPGA ? 2022-07-14 09:05 ? 次閱讀

數(shù)字硬件建模SystemVerilog-使用結(jié)構(gòu)體和聯(lián)合體的例子

使用結(jié)構(gòu)體和聯(lián)合體的例子

結(jié)構(gòu)體和聯(lián)合體可以包括壓縮或非壓縮數(shù)組,壓縮結(jié)構(gòu)體或聯(lián)合體只能包括壓縮數(shù)組。

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

壓縮和非壓縮的數(shù)組可以將結(jié)構(gòu)體和聯(lián)合體作為元素包含在數(shù)組中。在壓縮數(shù)組中,結(jié)構(gòu)體或聯(lián)合體也必須是壓縮的。

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

數(shù)組可以包含自定義結(jié)構(gòu)體和自定義聯(lián)合體。綜合支持?jǐn)?shù)組中的壓縮或非壓縮結(jié)構(gòu)體。

示例4-8說明了如何使用結(jié)構(gòu)體數(shù)組,該示例是一個(gè)指令寄存器模型,其中包含32條指令的非壓縮數(shù)組,每條指令是一個(gè)復(fù)合值,表示為壓縮結(jié)構(gòu)體。指令中的操作數(shù)可以是有符號(hào)的或無符號(hào)的,表示為兩種類型的聯(lián)合體。

該指令寄存器的輸入包括單獨(dú)的操作數(shù)、一個(gè)操作碼和一個(gè)指示操作數(shù)是有符號(hào)的還是無符號(hào)的標(biāo)志。該模型將這些單獨(dú)的輸入值加載到指令寄存器陣列中。一種寫入指針輸入控件,用于加載數(shù)據(jù)。該模型的輸出是單個(gè)指令結(jié)構(gòu)體,使用讀指針輸入從指令寄存器中選擇。

本例使用了前面示例4-6中所示的相同包項(xiàng)。

示例4-6:包含結(jié)構(gòu)體和聯(lián)合體定義的包

//
//Packagewithunionandstructuredefinitions
//
//`begin_keywords"1800-2012"http://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:使用結(jié)構(gòu)體數(shù)組對(duì)指令寄存器建模
//`begin_keywords"1800-2012"http://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顯示了綜合該示例的結(jié)果。說明了如何使用結(jié)構(gòu)體和聯(lián)合體、數(shù)組來建模大量設(shè)計(jì)功能,只需很少的代碼。示意圖右上角的矩形符號(hào)是綜合編譯器選擇報(bào)告的通用RAM的實(shí)例(在RTL模型中數(shù)組的存儲(chǔ)。)綜合編譯器將在綜合的最后一步將該通用RAM作為一個(gè)或多個(gè)同步存儲(chǔ)設(shè)備來實(shí)現(xiàn),其中通用門級(jí)功能映射到特定的ASICFPGA設(shè)備。

圖4-5:示例4-8的綜合結(jié)果:帶結(jié)構(gòu)體的指令寄存器 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-聯(lián)合體(union)

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

SystemVerilog-結(jié)構(gòu)體(二)

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

原文標(biāo)題:SystemVerilog-使用結(jié)構(gòu)體和聯(lián)合體的例子

文章出處:【微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120445
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7048

    瀏覽量

    89076
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3338

    瀏覽量

    66245

原文標(biāo)題:SystemVerilog-使用結(jié)構(gòu)體和聯(lián)合體的例子

文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    VirtualLab:系統(tǒng)建模分析器

    ,系統(tǒng)建模分析器。本文檔介紹該工具的使用方法。 系統(tǒng)建模分析器 如何運(yùn)行建模分析器 系統(tǒng)建模分析器 例1:光束清理濾波器 示例 – 光束清理濾波器 光束清理濾波器 – 光源
    發(fā)表于 12-19 12:36

    VirtualLab Fusion應(yīng)用:Herriott池的建模與仿真

    。Herriott單元是這種系統(tǒng)的一個(gè)例子,其特點(diǎn)是使用兩個(gè)球面反射鏡,在其中一個(gè)球面反射鏡上鉆一個(gè)離軸孔,以允許光束進(jìn)出。鏡子的曲率改變了光束的方向并控制了它的發(fā)散。在此用例中,我們用光學(xué)建模和設(shè)計(jì)軟件
    發(fā)表于 12-09 13:14

    如何通過建模與仿真提升電力電子組件的設(shè)計(jì)與性能?

    建模過程被稱為建模,而仿真被定義為使用模型研究實(shí)際或理論系統(tǒng)的行為和性能的過程。在仿真中,模型可以用于研究系統(tǒng)的現(xiàn)有或擬議特性。對(duì)于大型互聯(lián)系統(tǒng)的仿真,建模方法被證明是非常有效的。這篇文章介紹了解
    的頭像 發(fā)表于 11-25 11:35 ?228次閱讀
    如何通過<b class='flag-5'>建模</b>與仿真提升電力電子組件的設(shè)計(jì)與性能?

    Matlab/Simulink/Stateflow建模開發(fā)及仿真測(cè)試

    matlab 模擬仿真 熟悉Matlab/Simulink/Stateflow建模開發(fā)及仿真測(cè)試,熟悉V模型開發(fā)流程。 熟悉自動(dòng)代碼生成,能夠編寫或者配置自動(dòng)代碼生成腳本。
    發(fā)表于 10-24 17:23

    使用C2000 MCU對(duì)用于數(shù)字控制的雙向降壓/升壓轉(zhuǎn)換器進(jìn)行建模

    電子發(fā)燒友網(wǎng)站提供《使用C2000 MCU對(duì)用于數(shù)字控制的雙向降壓/升壓轉(zhuǎn)換器進(jìn)行建模.pdf》資料免費(fèi)下載
    發(fā)表于 10-12 11:48 ?0次下載
    使用C2000 MCU對(duì)用于<b class='flag-5'>數(shù)字</b>控制的雙向降壓/升壓轉(zhuǎn)換器進(jìn)行<b class='flag-5'>建模</b>

    知識(shí)分享 | 輕松實(shí)現(xiàn)優(yōu)質(zhì)建模

    知識(shí)分享在知識(shí)分享欄目中,我們會(huì)定期與讀者分享來自MES模賽思的基于模型的軟件開發(fā)相關(guān)Know-How干貨,關(guān)注公眾號(hào),隨時(shí)掌握基于模型的軟件設(shè)計(jì)的技術(shù)知識(shí)。輕松實(shí)現(xiàn)優(yōu)質(zhì)建模前言在基于模型的開發(fā)
    的頭像 發(fā)表于 09-12 08:08 ?404次閱讀
    知識(shí)分享 | 輕松實(shí)現(xiàn)優(yōu)質(zhì)<b class='flag-5'>建模</b>

    英特爾軟硬件構(gòu)建模塊如何幫助優(yōu)化RAG應(yīng)用

    硬件構(gòu)建模塊如何幫助優(yōu)化RAG應(yīng)用,在簡(jiǎn)化部署和支持?jǐn)U展的同時(shí),增強(qiáng)其上下文感知能力和實(shí)時(shí)響應(yīng)性能。 1 為您的應(yīng)用量身定制GenAI ChatGPT的面世改變了AI的發(fā)展格局。企業(yè)爭(zhēng)相利用這項(xiàng)新技術(shù)
    的頭像 發(fā)表于 07-24 15:12 ?439次閱讀
    英特爾軟<b class='flag-5'>硬件</b>構(gòu)<b class='flag-5'>建模</b>塊如何幫助優(yōu)化RAG應(yīng)用

    Python建模算法與應(yīng)用

    Python作為一種功能強(qiáng)大、免費(fèi)、開源且面向?qū)ο蟮木幊陶Z言,在科學(xué)計(jì)算、數(shù)學(xué)建模、數(shù)據(jù)分析等領(lǐng)域展現(xiàn)出了卓越的性能。其簡(jiǎn)潔的語法、對(duì)動(dòng)態(tài)輸入的支持以及解釋性語言的本質(zhì),使得Python在多個(gè)平臺(tái)
    的頭像 發(fā)表于 07-24 10:41 ?564次閱讀

    三維可視化建筑建模特點(diǎn)

    三維可視化建筑建模是一種利用計(jì)算機(jī)技術(shù)對(duì)建筑物進(jìn)行立體化表達(dá)和展示的過程,是建筑設(shè)計(jì)和規(guī)劃中不可或缺的重要環(huán)節(jié)。在當(dāng)今數(shù)字化時(shí)代,三維可視化建模已經(jīng)成為建筑設(shè)計(jì)和規(guī)劃中的常規(guī)操作,其特點(diǎn)主要表現(xiàn)
    的頭像 發(fā)表于 07-23 11:50 ?531次閱讀

    cad如何進(jìn)行三維建模

    三維建模是計(jì)算機(jī)輔助設(shè)計(jì)(CAD)中的一項(xiàng)重要技術(shù),它可以幫助設(shè)計(jì)師在計(jì)算機(jī)上創(chuàng)建和編輯三維模型。本文將介紹如何使用CAD軟件進(jìn)行三維建模,包括建模的基本步驟、建模技巧和注意事項(xiàng)等。
    的頭像 發(fā)表于 07-09 10:23 ?945次閱讀

    神經(jīng)網(wǎng)絡(luò)在數(shù)學(xué)建模中的應(yīng)用

    數(shù)學(xué)建模是一種利用數(shù)學(xué)方法和工具來描述和分析現(xiàn)實(shí)世界問題的過程。神經(jīng)網(wǎng)絡(luò)是一種模擬人腦神經(jīng)元結(jié)構(gòu)和功能的計(jì)算模型,可以用于解決各種復(fù)雜問題。在數(shù)學(xué)建模中,神經(jīng)網(wǎng)絡(luò)可以作為一種有效的工具,幫助我們更好
    的頭像 發(fā)表于 07-02 11:29 ?953次閱讀

    隧道BIM如何設(shè)計(jì)和建模

    隧道BIM (Building Information Modeling)是一種在隧道設(shè)計(jì)、建造和管理過程中使用數(shù)字化模型的方法。通過BIM技術(shù),設(shè)計(jì)師、工程師和建造者可以在一個(gè)統(tǒng)一的平臺(tái)上共享信息
    的頭像 發(fā)表于 06-04 15:54 ?395次閱讀

    IEEE 1800-2023 SystemVerilog新版本正式發(fā)布了!

    2024年3月初,在美國(guó)硅谷舉辦的DVCon2024上,IEEE-SA和Accellera聯(lián)合宣布通過IEEE Get Program可以免費(fèi)獲取IEEE 1800-2023 SystemVerilog語言參考手冊(cè)。
    的頭像 發(fā)表于 03-20 13:52 ?1753次閱讀

    在Vivado Synthesis中怎么使用SystemVerilog接口連接邏輯呢?

    SystemVerilog 接口的開發(fā)旨在讓設(shè)計(jì)中層級(jí)之間的連接變得更加輕松容易。 您可以把這類接口看作是多個(gè)模塊共有的引腳集合。
    的頭像 發(fā)表于 03-04 15:25 ?968次閱讀
    在Vivado Synthesis中怎么使用<b class='flag-5'>SystemVerilog</b>接口連接邏輯呢?

    gis建模與空間分析的區(qū)別

    進(jìn)行比較和解析。 首先,GIS建模是指將現(xiàn)實(shí)世界的地理實(shí)體和現(xiàn)象通過計(jì)算機(jī)技術(shù)和方法表達(dá)出來,用數(shù)字化的方式模擬、描述和分析。GIS建模可以分為兩個(gè)方面,即地理數(shù)據(jù)模型和地理過程模型。地理數(shù)據(jù)模型是指通過特定的數(shù)據(jù)結(jié)構(gòu)和模型來
    的頭像 發(fā)表于 02-25 14:57 ?970次閱讀