UVM 实战随书源码下载和运行

UVM 下载

官网下载


为了方便学习, 我们下载一个 1.1d 版本的

使用

为了方便学习, 我们直接使用张强的<UVM 实战> 使用的版本

到github 上下载, <UVM 实战> 的随书源码和 UVM 源码

1
   git clone https://github.com/emwzq/example_uvm.git

进入虚拟机 Redhat

1
2
  cd ~/
  cp -rf /mnt/hgfs/plh_work/example_uvm/ .

添加UVM 环境变量

把以下内容添加到 ~/.bashrc

1
   export UVM_HOME=~/example_uvm/uvm-1.1d

并且 source ~/.bashrc

跑第一个 UVM 例程

  1. 1
    
        cd ~/example_uvm/puvm/src/ch2/section2.2/2.2.1/
    
  2. 新建一个 makefile 并填入下列内容

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
       # compile
       vcs_compile:
                vcs -debug_access+r+w+nomemcbk -debug_region+cell +vpi -sverilog $(UVM_HOME)/src/dpi/uvm_dpi.cc -CFLAGS -DVCS -timesca    le=1ns/1ps -f filelist.f
       vcs_run:
                ./simv
       vcs_all:
                vcs -debug_access+r+w+nomemcbk -debug_region+cell +vpi -sverilog $(UVM_HOME)/src/dpi/uvm_dpi.cc -CFLAGS -DVCS -timescale=1ns/1ps -f filelist.f
                ./simv
       clean:
                rm -rf csrc/ simv.daidir/ simv
    
  3. 新建一个 filelist.f 并填入下列内容

    1
    2
    3
    4
    5
    6
    
       +incdir+$UVM_HOME/src
       $UVM_HOME/src/uvm_pkg.sv
       /home/user/example_uvm/puvm/src/ch2/dut/dut.sv
       top_tb.sv
       # dut.sv是DUT
       # top_tb.sv是测试平台最顶层
    
  4. make

    1
    
       make vcs_compile
    

    没有意外的话 这里会出错, 原因是 uvm 的宏定义有语法错误, 需要修改一下才能使用, 修改见本文后面

  5. run

    1
    
       make vcs_run
    

修改 uvm 源码以通过编译

注意: 貌似Windows 下有下面这个问题, 在MACOS 上没有问题

报错地方

1
2
3
4
5
6
`define uvm_field_utils_end \
     if(what__ inside {UVM_SETINT,UVM_SETSTR,UVM_SETOBJ}) begin \
        // remove all scopes recorded (through super and other objects visited before) \
        void'(__current_scopes.pop_back()); \
        __m_uvm_status_container.m_uvm_cycle_scopes = __current_scopes; \
     end \ 

错误信息:

1
2
3
4
5
6
7
8
Error-[SE] Syntax error
  Following verilog source has syntax error :
  "/home/user/example_uvm/uvm-1.1d/src/macros/uvm_object_defines.svh", 176: 
  token is ''('
          void'(__current_scopes.pop_back()); \
                ^

1 error

原因分析

仔细阅读上下行代码,很好理解,原因是//开头的注释相当于将后面的整行代码注释掉了,而又由于有 \ 符号将后面的代码接上了,于是编译器的编译规则默认下面的几行也注释掉了,所以后面的代码不能起效,自然报错。。

解决

这类错误会出现在以下几个文件中:

1
2
3
$UVM_HOME/src/macros/uvm_object_defines.svh
$UVM_HOME/src/macros/uvm_printer_defines.svh
$UVM_HOME/src/macros/uvm_tlm_defines.svh

将uvm的库文件里面所有含有//开头且以\结尾的注释行都替换掉
采用vim/gvim打开后使用正则表达式替换掉即可。具体替换的正则表达式如下:

1
%s#\(^.*\/\)\/\(.*\)\\$#\1*\2*/ \

参考博文

https://east1203.github.io/2019/06/13/IC/tools/%E7%94%A8VCS%E5%90%AF%E5%8A%A8UVM%E4%BB%BF%E7%9C%9F/

Licensed under CC BY-NC-SA 4.0