当前位置:   article > 正文

《从零开始,搭建一个简单的UVM验证平台》实操_csdn uvm

csdn uvm

最近的工作中需要用UVM平台去仿真软件同事写的C程序,虽然只要用EDA同事已经搭好的UVM平台稍微改改就行,但对于我这种从未接触过UVM甚至都没用过System Verilog的纯FPGA工程师来说还是很有难度的,因为我对这方面一点概念都没有。

基于此,想着边用边学,就在网上找了一些资料学习。看到了下面这篇文章:

从零开始,搭建一个简单的UVM验证平台(一)

看着还是挺简单的,但亲自动手去做一遍,还是费了很大功夫的。虽然这个博客里提供了大部分代码,但并没有写一步步地怎么做。另外,特别注意,这个博客系列文章里的代码有一些小问题,会导致结果出不来,我就遇到了好几个坑。

下面就记录下,我一步步的过程,并附上所以源码和相应的截图。

第1步:把这几个模块代码拷贝下来

dut.v

  1. module dut(
  2. input clk ,
  3. input rstn ,
  4. input [7:0] data_i ,
  5. input data_i_valid ,
  6. output reg [7:0] data_o ,
  7. output reg data_o_valid
  8. );
  9. always @(posedge clk)begin
  10. if(!rstn)begin
  11. data_o <= 8'd0;
  12. data_o_valid <= 1'b0;
  13. end
  14. else begin
  15. data_o <= data_i;
  16. data_o_valid <= data_i_valid;
  17. end
  18. end
  19. endmodule

my_driver.sv

  1. //`ifndef _MY_DRIVER
  2. //`define _MY_DRIVER
  3. `include "uvm_macros.svh"
  4. import uvm_pkg::*;
  5. class my_driver extends uvm_driver;
  6. `uvm_component_utils(my_driver); // 注册
  7. function new(string name = "my_driver", uvm_component parent = null);
  8. super.new(name, parent);
  9. `uvm_info("my_driver", "new is called.", UVM_LOW)
  10. endfunction
  11. extern virtual task main_phase(uvm_phase phase);
  12. endclass
  13. task my_driver::main_phase(uvm_phase phase);
  14. phase.raise_objection(this);
  15. `uvm_info("my_driver", "main phase is called.", UVM_LOW);
  16. top_tb.data_i <= 8'd0;
  17. top_tb.data_i_valid <= 1'b0;
  18. while(!top_tb.rstn)
  19. @(posedge top_tb.clk);
  20. for(int i = 0; i < 256; i = i+1)begin
  21. @(posedge top_tb.clk)
  22. top_tb.data_i <= $urandom_range(0,255);
  23. top_tb.data_i_valid <= 1'b1;
  24. `uvm_info("my_driver", "data is drived.", UVM_LOW)
  25. end
  26. @(posedge top_tb.clk);
  27. top_tb.data_i_valid <= 1'b0;
  28. phase.drop_objection(this);
  29. endtask
  30. //`endif

top_tb.sv

  1. `timescale 1ns/1ps
  2. `include "uvm_macros.svh" //这是UVM中的一个文件,包含了众多宏定义
  3. import uvm_pkg::*; //只有导入了这个库,编译器在编译my_driver.sv文件时才会认识其中继承的uvm_driver等类名
  4. //`include "my_driver.sv"
  5. module top_tb;
  6. reg clk,rstn;
  7. reg [7:0] data_i;
  8. reg data_i_valid;
  9. wire [7:0] data_o;
  10. wire data_o_valid;
  11. dut my_dut(
  12. .clk (clk ) ,
  13. .rstn (rstn ) ,
  14. .data_i (data_i) ,
  15. .data_o (data_o) ,
  16. .data_i_valid (data_i_valid) ,
  17. .data_o_valid (data_o_valid)
  18. );
  19. //initial begin
  20. // my_driver drv; // instance
  21. // drv = new("drv", null);
  22. // drv.main_phase(null);
  23. // $finish();
  24. //end
  25. initial begin
  26. run_test("my_driver");
  27. end
  28. initial begin
  29. clk = 0;
  30. forever begin
  31. #100 clk = ~clk;
  32. end
  33. end
  34. initial begin
  35. rstn = 1'b0;
  36. #1000
  37. rstn = 1'b1;
  38. end
  39. initial begin
  40. $fsdbDumpfile("tb.fsdb");
  41. $fsdbDumpvars;
  42. end
  43. endmodule

第2步:产生filelist

find ./ -name "*.*v" > filelist.f

第3步:产生makefile

这个makefile,我是在网上找了一些资料作为参考,写了个简单能用的。

  1. #--------------------------------------------------------------------------------------
  2. all : clean vcs
  3. #--------------------------------------------------------------------------------------
  4. vcs :
  5. vcs -f filelist.f \
  6. -ntb_opts uvm \
  7. -timescale=1ns/1ps \
  8. -full64 -R +vc +v2k -sverilog \
  9. -debug_access \
  10. -kdb \
  11. -l simv.log &
  12. #--------------------------------------------------------------------------------------
  13. verdi :
  14. verdi -f filelist.f -ssf tb.fsdb &
  15. #--------------------------------------------------------------------------------------
  16. clean :
  17. rm -rf *~ core csrc simv* vc_hdrs.h ucli.key urg* *.log novas.* *.fsdb*
  18. rm -rf 64* DVEfiles *.vpd verdiLog verdi_config_file
  19. #---------------------------------------------------------------------------------------

第4步:编译

所有文件如上图所示,在当前路径下执行如下命令进行编译:

  1. make all
  2. 或者
  3. make vcs

第5步:查看结果

编译结果如下图所示:

也可以打开simv.log查看编译结果,还可以用make verdi查看波形。


附:问题记录

我现在学到了第三篇,也就是下面这篇博客,遇到了几个问题,卡了我好几天才找到原因,也一并记录在此,方便后来人!

从零开始,搭建一个简单的UVM验证平台(三)

第一个问题

第二个问题,这个是巨坑啊,编译的时候发现会卡住,一直找不到原因,差点让我UVM从入门到放弃,花了几天的时间各种找资料各种加log才定位到这里。啊。。。超级想骂人!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/563645
推荐阅读
相关标签
  

闽ICP备14008679号