摘要:我们常用的debug UVM的方法是通过打印log实现。有没有办法像 debug RTL代码一样将UVM中变量拉到波形上看呢?答案是有的,下面让我们看看是怎么做到的。 第一步在UVM compile 的选项里面加入 -debug_access+all  uvm_config_int; typedef uvm_config_db#(string) uvm_config_string; typedef uvm_config_db#
阅读全文
摘要:``` # # # Cortex-M System Design Kit software compilation make file # # # # Configurations # CPU_PRODUCT = CORTEX_M0 # Shared software directory SOFTW
阅读全文
摘要:``` # # # Cortex-M System Design Kit software compilation make file # # # # Configurations # CPU_PRODUCT = CORTEX_M0 # Shared software directory SOFTW
阅读全文
摘要:``` # # # Cortex-M0 DesignStart RTL Bundle simulation make file # # # # Configurations # # Name of test directory (e.g. hello, dhry) # TESTNAME must b
阅读全文
摘要:编译testcase ``` all_gcc: arm-none-eabi-gcc \ 生成可执行文件; -g -O3 -mthumb \ 生成调试信息;程序优化等级;指定精简指令集,16bit; -mcpu=cortex-m0 -mbig-endian \ 指定cpu类型;指定大端格式; ../.
阅读全文
摘要:1. 前言 书接上文《ARM_Cortex-M0 DesignStart系列--3rtl仿真过程的详细分析》,本文基于hello这个case,对Cortex M0的启动过程做一个详细的分析,其实整个ARM Cortex M系列的启动的过程都是很相似的,这对我们理解SoC的启动过程会很有帮助。 2.
阅读全文
摘要:1. 概述 书接上文《ARM_Cortex-M0 DesignStart系列—2基于xrun的rtl仿真》,本文依然以hello这个test为例,来说明整个rtl仿真的详细过程。通过对整个仿真过程的分析,有助于我们对SoC level仿真的理解以及对整个项目的理解。 让我们沿着,仿真的逻辑顺序以及数
阅读全文
摘要:1.前期准备 1.1 《ARM Cortex-M0 DesignStart系列—1概述及实验准备》; 1.2 xcelium(xrun)软件的安装以及环境变量的设置; 1.3 indago的安装以及环境变量设置。 2. 修改Makefeile,增加对xrun的支持 修改目录cortexm0_desi
阅读全文
摘要:1.概述 ARM Cortex-M系列多么经典,就不用我安利了吧。本文基于ARM Cortex-M0 DesignStart Design Kit套件做研究,该套件是ARM公司十年之前就开源了的,在ARM官网可以下载。由于该套件对于学习和研究ARM Cortex M系列CPU有非常高的价值,所有在互
阅读全文
摘要:在建立寄存器模型后,一般都是通过层次引用的方式访问寄存器; 但是出于某些原因,如果依然要使用地址来访问寄存器模型,那么可以使用get_reg_by_offset函数通过寄存器地址得到一个uvm_reg的指针,再调用此uvm_reg的read或write就可以进行读写操作; ``` class cas
阅读全文
摘要:要使用寄存器模型,一般是将寄存器模型的指针传递过来; 除了这种方法,uvm还提供函数,使得可以在不使用指针传递的情况下得到寄存器模型的指针; ``` virtual task body(); uvm_status_e status; uvm_reg_data_t value; bit[31:0] c
阅读全文
摘要:uvm_reg_mem_hdl_paths_seq可以用于检查hdl路径的正确性。 这个sequence的运行依赖于在基类uvm_reg_sequence中定义的一个变量:uvm_reg_block model; ``` class case0_cfg_vseq extends uvm_sequen
阅读全文
摘要:peek对应与read;poke对应与poke; uvm_reg::peek()/poke()两个方法,也分别对应了读取寄存器(peek)和修改寄存器(poke)两种操作,而用户无需指定访问方式为UVM_BACKDOOR,因为这两个方法本来就只针对于后门访问。 ``` p_sequencer.p_r
阅读全文
摘要:第一种写法: ``` function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); bus_transaction tr; tr = new("tr"); tr.addr = rw.addr; tr.bus_op = (rw.kin
阅读全文
摘要:第一种写法: 当driver将读取值返回后,寄存器模型会更新寄存器的镜像值和期望值。这个功能被称为寄存器模型的自动预测功能auto_predict; 在建立寄存器模型时,使用如下语句打开此功能:`rm.default_map.set_auto_perdict(1)` ``` function voi
阅读全文
摘要:导入编译后的代码到CPU中 module tb; //将编译后的代码放入到cpu中 `ifndef GATE_SIM initial begin $readmemh("inf0_mem.txt",tb.u0_chip.u0_digcore.u_digcore_func.u0_flash_ctrl_t
阅读全文
摘要:Verilog/SystemVerilog ``` //条件语句 if () else if() else //条件编译 `ifdef macro `ifndef macro `elsif macro `else `endif ``` bash shell ``` //条件语句 if command
阅读全文
摘要:``` i=0; //第一种方法 ((i++)); //第二种方法 let i+=1; //第三种方法 i=
((i + 1 )); //第四种方法 i=
[i + 1 ] //第五种方法 i=`expr $i + 1` ```
阅读全文
摘要:linux中经常会出现此类错误 ``` $ rm -rf /home/.../oxford_flowers rm: cannot remove '/.../oxford_flowers/CoOp/rn50_ep50_1shots/nctx1_cscTrue_ctpend/seed2/.nfs0000
阅读全文
摘要:最近有群友问我system Verilog 和C怎么交互,在网上搜了一圈发现资料比较少,今天这里就和大家讲讲system Verilog 和C的交互。话不多说直接上干货。 第一种 Verilog 通过PLI调用C函数。 PLI全称 Program Language Interface,程序员可以通过
阅读全文
摘要:SystemVerilog中的宏是一种预处理指令,用于在代码中定义和使用常量、字符串、表达式、代码段。宏可以使代码更加简洁和易于阅读,提高代码的可重用性和可维护性。 宏在验证环境的搭建中经常使用,主要有以下的一些场景。 定义常量 宏可以用来定义常量,如数据位宽,lane个数等。 ``` `defin
阅读全文
摘要:SOC是啥?System on Chip。一个芯片,但是片上有好多东西的意思。市面上的AI芯片、包括你知道的麒麟xxx,骁龙xxx等等一系列手机芯片都是SOC。对于SOC设计者来讲,显然要知道码农们码出来的一行行代码是如何在SOC上跑起来的。 来自清华大学工学博士桔里猫用科普的方式为介绍SOC代码的
阅读全文
摘要:这里用一个非常简单的例子来展示vim自定义自己的语法并高亮显示的设置流程。 所使用的实例语言是python,为了区分vim自带的python语法,我们把文件名保存为test.me,其内容如下图所示: ,并且使用UVM-1.1和UVM-1.2居然`uvm_info显示的时间还不一样,这到底是怎么回事儿呢?下面本文将通过追究下到底是什么原因导致的,
阅读全文
摘要:``` 在搭建验证环境时,经常需要在环境中插入很多info用于输出一定的log信息用于进行debug,在插入这些info方法的时候,经常需要同时输出该方法执行的具体时间,用于方便定位问题,为此在Verilog和SystemVerilog中提供了一堆关于time的方法,如果对于这些方法使用的不是很恰当
阅读全文
摘要:通常我们需要在验证环境中对路径path做正则或者对寄存器名做正则匹配来做针对的处理,如打印,检查或者屏蔽等操作,因此我们需要能在UVM环境中使用正则表达式进行字符串的搜索匹配。 恰好,UVM给我们提供了两个接口,分别是如下两个函数: ``` function int uvm_re_match(str
阅读全文
摘要:相信大家对于SystemVerilog里的force和release,以及assign和deassign已经比较熟悉了。 force和release配合使用,可以用来强制赋值,优先级高于assign和deassign,这两者都属于连续赋值语句。 但是force的值会一直保持,而deposit只是se
阅读全文
摘要:这个系统函数在[IEEE]SystemVerilog.std.1800_2017里你是搜索不到的,但是你在SystemVerilog的环境中是可以使用的。 你可以使用$stack()这个系统函数来查看报错的文件层次,类似于python的trackback,可以帮助你定位异常问题,从而协助你进行deb
阅读全文
摘要:SystemVerilog中,initial begin-end是仿真开始就会执行的代码块。比如UVM的test入口函数run_test,一般就是在initial begin-end中调用。还有一些tb会在initial begin-end中使用fork join_none,用于创建一些仿真中的后台
阅读全文
摘要:```
strobestrobe 为选通显示任务。
strobe使用方法与display 一致,但打印信息的时间和
display有所差异(也可以直接打印文本)。当许多语句与display 任务在同一时间内执行时,这些语句和 $display 的执行顺序是不确定的,一般按照程序
阅读全文
摘要:``` 1.前言 在verilog仿真中,利用
fopen打开文件后,对文件进行读写操作的系统函数有fdisplay,
fwrite,fmonitor, $fstrobe等系统函数,利用这些系统函数,可以将数据写到对应的文件中。下面就针对这些用法做一个梳理。本文主要讲
$fdisplay和
$
阅读全文
摘要:相对于RTL仿真,门级仿真占用的计算资源虽然很多,但是在静态时序检查(STA)工具普遍应用之前,带时序的动态门级仿真几乎可以说是唯一的timing sign-off手段了。 那么在STA工具已经成熟的现在,门级仿真还有存在的必要吗?为什么有些公司的设计流程中还包括门级仿真这个必需的步骤呢? 可能存在
阅读全文
摘要:请编写一个makefile同时编译、链接下面两个程序: ``` main1.c: #include int main(void) { printf("main1\n"); } main2.c: #include int main(void) { printf("main2\n"); } ``` 【分
阅读全文