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

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

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

initial begin-end真的是仿真最早執(zhí)行的嗎?

sanyue7758 ? 來源:驗證芯發(fā)現(xiàn) ? 2023-05-22 10:41 ? 次閱讀

SystemVerilog中,initial begin-end是仿真開始就會執(zhí)行的代碼塊。比如UVM的test入口函數(shù)run_test,一般就是在initial begin-end中調(diào)用。還有一些tb會在initial begin-end中使用fork join_none,用于創(chuàng)建一些仿真中的后臺進程,如時鐘產(chǎn)生,后門驅(qū)動等。

那么initial begin-end真的是仿真最早執(zhí)行的嗎?

如果是消耗仿真時間的,那initial begin-end中的代碼是仿真開始最早執(zhí)行的。如果不消耗仿真時間,那還有一種代碼會早于initial begin-end執(zhí)行。

static property/function !!!

static類型變量,無論是全局變量,還是class內(nèi)部參數(shù),會在仿真開始前確定其初始值。如果該初始值是一個由static類型的function返回值決定,則該function的代碼會在initial begin-end前執(zhí)行完畢。

可以參考如下的測試:

importuvm_pkg::*;
`include"uvm_macros.svh"
classstatic_wrapper;
staticbitfst_flag=cls_func_before_initial("static_wrapper:fst_flag");
staticbitsnd_dlag=cls_func_before_initial("static_wrapper:snd_flag");

staticfunctionbitcls_func_before_initial(stringx);
intcnt;
cnt++;
$display("cls_func_before_initial:",x,"@",$time);
return1;
endfunction
endclass

staticfunctionbitglb_func_before_initial(stringx);
intcnt;
cnt++;
$display("glb_func_before_initial:",x,"@",$time);
return1;
endfunction

classtestextendsuvm_test;
`uvm_component_utils(test)
functionnew(stringname="test",uvm_componentparent=null);
super.new(name,parent);
endfunction

virtualtaskmain_phase(uvm_phasephase);
super.main_phase(phase);
phase.raise_objection(this);
uvm_top.print();
phase.drop_objection(this);
endtask
endclass
programtb_top;
staticbitthd_flag=glb_func_before_initial("thd_flag");
initialbegin
$display("initialbegin...@",$time);
run_test("test");
$display("initialend...@",$time);
end
endprogram

仿真結(jié)果如下:

cls_func_before_initial:static_wrapper:fst_flag@0
cls_func_before_initial:static_wrapper:snd_flag@0
glb_func_before_initial:thd_flag@0
initialbegin...@0
UVM_INFO@0:reporter[RNTST]Runningtesttest...
-------------------------------------
NameTypeSizeValue
-------------------------------------
uvm_root-@172
uvm_test_toptest-@336
-------------------------------------
UVM_INFO/apps/vcsmx/vcs/S-2021.09//etc/uvm-1.2/src/base/uvm_report_server.svh(904)@0:reporter[UVM/REPORT/SERVER]
---UVMReportSummary---

**Reportcountsbyseverity
UVM_INFO:2
UVM_WARNING:0
UVM_ERROR:0
UVM_FATAL:0
**Reportcountsbyid
[RNTST]1
[UVM/RELNOTES]1
$finishcalledfromfile"/apps/vcsmx/vcs/S-2021.09//etc/uvm-1.2/src/base/uvm_root.svh",line527.
$finishatsimulationtime0

可以看到cls_func_before_initial和glb_func_before_initial兩個function都會在initial begin-end前執(zhí)行。

上面的例子也可以看到,在run_test之后的代碼塊并不會執(zhí)行,這是因為run_test執(zhí)行結(jié)束后,UVM機制會直接調(diào)用$finish函數(shù)結(jié)束仿真。

其實在UVM中,已經(jīng)利用了static變量的初始化這一特性。UVM的工廠模式中,使用uvm_component_utils/uvm_object_utils向工廠中注冊組件時,就利用了這一特性。逐層展開uvm_component_utils宏時,可以看到如下的代碼:

classuvm_component_registry#(typeT=uvm_component,stringTname="")extendsuvm_object_wrapper;
//....
localstaticthis_typeme=get();
staticfunctionthis_typeget();
if(me==null)begin
uvm_coreservice_tcs=uvm_coreservice_t::get();
uvm_factoryfactory=cs.get_factory();
me=new;
factory.register(me);
end
returnme;
endfunction
//....

思路打開,利用static變量初始化這一特性,可以嘗試更多的應(yīng)用。






審核編輯:劉清

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

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110107
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19171

原文標(biāo)題:initial begin-end真的是SystemVerilog 仿真最早執(zhí)行的嗎?

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    重點介紹所有綜合編譯器都支持的for和repeat循環(huán)

    循環(huán)語句允許多次執(zhí)行編程語句或begin-end語句組。SystemVerilog中的循環(huán)語句有:for、repeat、while、do..while、foreach和forever。
    的頭像 發(fā)表于 11-03 09:10 ?2140次閱讀
    重點介紹所有綜合編譯器都支持的for和repeat循環(huán)

    GPIO Init函數(shù)結(jié)尾沒有begin end用戶編輯區(qū)域,為什么?

    MX_GPIO_Init初始換函數(shù)結(jié)尾沒有begin end用戶編輯區(qū)域,但是在其他初始化函數(shù)后有編輯區(qū)域,并且在main.c文件每個初始化后方也沒有用戶編輯界面,如果想要在初始化結(jié)尾做一些事情,在
    發(fā)表于 09-26 06:08

    pxa255開發(fā)板原理圖及源代碼

    $finish ;endendmodule【例5.5】用begin-end 串行塊產(chǎn)生信號波形`timescale 10ns/1nsmodule wave1;reg wave;parameter
    發(fā)表于 06-27 10:01

    為什么msp430g2553在仿真的時候程序能執(zhí)行,脫機無法執(zhí)行

    為什么msp430g2553在仿真的時候程序能執(zhí)行,但是脫機工作之后就執(zhí)行不了???????
    發(fā)表于 07-28 19:10

    begin ...... end 與 fork ...... join 語句的 區(qū)別 ------ 轉(zhuǎn)載

    按照界定不同分為兩種:(1)begin……end,用來組合需要順序執(zhí)行的語句,被稱為串行塊。例如:parameter d = 50; reg[7:0] r; begin //由一系列延
    發(fā)表于 06-02 21:31

    ModleSim仿真的時候有一個信號不能被賦值

    1ns/1psmodule uart_tb();reg clk_50M;reg rst;reg rs232_rx; initial begin clk_50M = 0; forever #10
    發(fā)表于 03-05 21:30

    怎樣把pad designer軟件里Bgn層的BEGIN LAYER改為END LAYER?

    怎樣把pad designer軟件里Bgn層的BEGIN LAYER改為END LAYER
    發(fā)表于 05-04 15:47

    SIMULINK仿真的運行

    SIMULINK仿真的運行構(gòu)建好一個系統(tǒng)的模型之后,接下來的事情就是運行模型,得出仿真結(jié)果。運行一個仿真的完整過程分成三個步驟:設(shè)置仿真參數(shù),啟動仿
    發(fā)表于 06-19 12:53 ?4150次閱讀

    initial和always兩者的關(guān)系分析

    兩者的關(guān)系 一個程序塊可以有多個initial和always過程塊。每個initial和always說明語句在仿真的一開始同時立即開始執(zhí)行init
    的頭像 發(fā)表于 11-24 14:48 ?5746次閱讀

    Verilog的兩種塊語句解析

    1. 塊語句有兩種,一種是 begin-end 語句, 通常用來標(biāo)志()執(zhí)行的語句;一種是 fork-join 語句,通常用來標(biāo)志()執(zhí)行的語句。 答案:順序,并行 解析: (1)begin_
    的頭像 發(fā)表于 06-18 15:16 ?3060次閱讀

    Verilog的塊語句fork...join 和 begin...end

    begin_end順序塊,用于將多條語句組成順序塊,語句按順序一條一條執(zhí)行(除了帶有內(nèi)嵌延遲控制的非阻塞賦值語句),每條語句的延遲時間是相對于由上一條語句的仿真時間而言;
    的頭像 發(fā)表于 06-09 10:30 ?3243次閱讀

    淺析標(biāo)準(zhǔn)的Verilog對語句有兩種分組方式

    標(biāo)準(zhǔn)的Verilog對語句有兩種分組方式——使用beginend或fork…join,beginend中的語句以順序方式執(zhí)行,而fork
    的頭像 發(fā)表于 09-14 11:02 ?892次閱讀
    淺析標(biāo)準(zhǔn)的Verilog對語句有兩種分組方式

    仿真的自定義

    本文將介紹通過更改所提供的仿真電路的元器件、常數(shù)和條件等來執(zhí)行仿真的方法。
    的頭像 發(fā)表于 02-14 09:26 ?850次閱讀
    <b class='flag-5'>仿真的</b>自定義

    verilog中initial和always的區(qū)別

    執(zhí)行行為。雖然它們都可以用于設(shè)計和模擬電路行為,但它們在語義和用途上有一些重要的區(qū)別。 initial語句: initial語句通常用于初始化內(nèi)部變量和寄存器的值,并執(zhí)行
    的頭像 發(fā)表于 02-22 16:09 ?2928次閱讀

    verilog中repeat必須用beginend

    在Verilog中,repeat語句不需要使用beginend塊。repeat語句是一種循環(huán)控制語句,允許重復(fù)執(zhí)行一個代碼塊指定的次數(shù)。它的一般語法如下: repeat (n) statement
    的頭像 發(fā)表于 02-23 10:14 ?1222次閱讀