0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

initial begin-end真的是仿真最早执行的吗?

sanyue7758 来源:验证芯发现 2023-05-22 10:41 次阅读

SystemVerilog中,initial begin-end是仿真开始就会执行的代码块。比如UVM的test入口函数run_test,一般就是在initial begin-end中调用。还有一些tb会在initial begin-end中使用fork join_none,用于创建一些仿真中的后台进程,如时钟产生,后门驱动等。

那么initial begin-end真的是仿真最早执行的吗?

如果是消耗仿真时间的,那initial begin-end中的代码是仿真开始最早执行的。如果不消耗仿真时间,那还有一种代码会早于initial begin-end执行。

static property/function !!!

static类型变量,无论是全局变量,还是class内部参数,会在仿真开始前确定其初始值。如果该初始值是一个由static类型的function返回值决定,则该function的代码会在initial begin-end前执行完毕。

可以参考如下的测试:

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

仿真结果如下:

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前执行。

上面的例子也可以看到,在run_test之后的代码块并不会执行,这是因为run_test执行结束后,UVM机制会直接调用$finish函数结束仿真。

其实在UVM中,已经利用了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变量初始化这一特性,可以尝试更多的应用。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110157
  • UVM
    UVM
    +关注

    关注

    0

    文章

    182

    浏览量

    19189

原文标题:initial begin-end真的是SystemVerilog 仿真最早执行的吗?

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

收藏 人收藏

    评论

    相关推荐

    重点介绍所有综合编译器都支持的for和repeat循环

    循环语句允许多次执行编程语句或begin-end语句组。SystemVerilog中的循环语句有:for、repeat、while、do..while、foreach和forever。
    的头像 发表于 11-03 09:10 2178次阅读
    重点介绍所有综合编译器都支持的for和repeat循环

    GPIO Init函数结尾没有begin end用户编辑区域,为什么?

    MX_GPIO_Init初始换函数结尾没有begin end用户编辑区域,但是在其他初始化函数后有编辑区域,并且在main.c文件每个初始化后方也没有用户编辑界面,如果想要在初始化结尾做一些事情,在
    发表于 09-26 06:08

    pxa255开发板原理图及源代码

    $finish ;endendmodule【例5.5】用begin-end 串行块产生信号波形`timescale 10ns/1nsmodule wave1;reg wave;parameter
    发表于 06-27 10:01

    为什么msp430g2553在仿真的时候程序能执行,脱机无法执行

    为什么msp430g2553在仿真的时候程序能执行,但是脱机工作之后就执行不了啊?????
    发表于 07-28 19:10

    begin ...... end 与 fork ...... join 语句的 区别 ------ 转载

    按照界定不同分为两种:(1)begin……end,用来组合需要顺序执行的语句,被称为串行块。例如:parameter d = 50; reg[7:0] r; begin //由一系列延
    发表于 06-02 21:31

    ModleSim仿真的时候有一个信号不能被赋值

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

    怎样把pad designer软件里Bgn层的BEGIN LAYER改为END LAYER?

    怎样把pad designer软件里Bgn层的BEGIN LAYER改为END LAYER
    发表于 05-04 15:47

    SIMULINK仿真的运行

    SIMULINK仿真的运行构建好一个系统的模型之后,接下来的事情就是运行模型,得出仿真结果。运行一个仿真的完整过程分成三个步骤:设置仿真参数,启动仿
    发表于 06-19 12:53 4158次阅读

    initial和always两者的关系分析

    两者的关系 一个程序块可以有多个initial和always过程块。每个initial和always说明语句在仿真的一开始同时立即开始执行init
    的头像 发表于 11-24 14:48 5775次阅读

    Verilog的两种块语句解析

    1. 块语句有两种,一种是 begin-end 语句, 通常用来标志()执行的语句;一种是 fork-join 语句,通常用来标志()执行的语句。 答案:顺序,并行 解析: (1)begin_
    的头像 发表于 06-18 15:16 3074次阅读

    Verilog的块语句fork...join 和 begin...end

    begin_end顺序块,用于将多条语句组成顺序块,语句按顺序一条一条执行(除了带有内嵌延迟控制的非阻塞赋值语句),每条语句的延迟时间是相对于由上一条语句的仿真时间而言;
    的头像 发表于 06-09 10:30 3258次阅读

    浅析标准的Verilog对语句有两种分组方式

    标准的Verilog对语句有两种分组方式——使用beginend或fork…join,beginend中的语句以顺序方式执行,而fork
    的头像 发表于 09-14 11:02 898次阅读
    浅析标准的Verilog对语句有两种分组方式

    仿真的自定义

    本文将介绍通过更改所提供的仿真电路的元器件、常数和条件等来执行仿真的方法。
    的头像 发表于 02-14 09:26 860次阅读
    <b class='flag-5'>仿真的</b>自定义

    verilog中initial和always的区别

    执行行为。虽然它们都可以用于设计和模拟电路行为,但它们在语义和用途上有一些重要的区别。 initial语句: initial语句通常用于初始化内部变量和寄存器的值,并执行
    的头像 发表于 02-22 16:09 3015次阅读

    verilog中repeat必须用beginend

    在Verilog中,repeat语句不需要使用beginend块。repeat语句是一种循环控制语句,允许重复执行一个代码块指定的次数。它的一般语法如下: repeat (n) statement
    的头像 发表于 02-23 10:14 1265次阅读