在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2393|回复: 3

[求助] uvm验证spi接口为总线的ip时,怎么对寄存器进行连续的读或写操作

[复制链接]
发表于 2019-3-15 17:08:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
正常的按《UVM实战》写的那样只能对单个寄存器进行一次的读写操作,比如想要让spi进行一长段的发送怎么写adapter以下是写的adater和transaction以及driver




  1. class spi_adapter extends uvm_reg_adapter;

  2.    function new(string name = "spi_adapter");  
  3.       super.new(name);
  4.    endfunction

  5.    virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw);
  6.       spi_tr tr;
  7.       tr = new("tr");
  8.       tr.data[0][7]   = (rw.kind == UVM_READ) ? 1'b0 : 1'b1;
  9.       tr.data[0][6:0] = rw.addr;
  10.       tr.data[1]      = rw.data;
  11.       return tr;
  12.    endfunction   
  13. 其中tr定义成动态数组,但是在adapter的时候根据连续多谢的字节进行调整??
  14.    virtual function void bus2reg(uvm_sequence_item bus_item, ref uvm_reg_bus_op rw);
  15.       spi_tr tr;
  16.       if(!$cast(tr,bus_item)) begin
  17.          `uvm_fatal(get_type_name(),"Provided bus_item is not of the correct type. expecting bus_transaction")
  18.          return; //?????????
  19.       end
  20.       rw.kind = (tr.data[0][7] == 1'b0) ? UVM_READ : UVM_WRITE;
  21.       rw.addr = tr.data[0][6:0];
  22.       rw.data = tr.data[1];
  23.       rw.status = UVM_IS_OK;
  24.    endfunction   

  25.    `uvm_object_utils(spi_adapter)
  26. endclass : spi_adapter


复制代码



class spi_tr extends uvm_sequence_item;
    rand logic [7:0]  data[];
  //  rad logic [2:0]  cs_delay;

    `uvm_object_utils_begin(spi_tr)               //use factory register
       `uvm_field_array_int(data,UVM_ALL_ON)      //use field_automation   mechanism
   //    `uvm_field_int(cs_delay,UVM_ALL_ON)
    `uvm_object_utils_end


    function new(string name = "spi_tr");
       super.new(name);
    endfunction


endclass  






  1. task  spi_driver::configure_phase(uvm_phase phase);
  2.          vtspi_if.cs   <= 1'b1;//add to reset phase
  3.          vtspi_if.mosi <= 1'b0;
  4.          vtspi_if.miso <= 1'b0;
  5.          vtspi_if.sclk <= 1'b1;
  6.          `uvm_info("spi_driver","111",UVM_LOW)
  7.          while(!vtspi_if.rstn)
  8.            #1;
  9.          `uvm_info("spi_driver","222",UVM_LOW)
  10.          while(1)begin
  11.             seq_item_port.get_next_item(req);
  12.             req.print();
  13.             sent_spi(req);
  14.             seq_item_port.item_done();
  15.          end   
  16. endtask

  17. task spi_driver::sent_spi(spi_tr tr);
  18.          vtspi_if.cs=0;
  19.          sdo_q.delete();
  20.          repeat(cs_delay) @(vtspi_if.mck);
  21.          foreach(tr.data[j]) begin
  22.             for(int i=7;i>=0;i--)begin
  23.                 vtspi_if.sclk=1'b0;   
  24.                 vtspi_if.mosi=tr.data[j][i];
  25.                 sdo_q.push_back(vtspi_if.miso);
  26.                 repeat(spi_prescale) @(vtspi_if.mck);
  27.             end
  28.             if(tr.data[0][7]==1)begin
  29.                foreach(tr.data[n])begin
  30.                   for(int m=0;m<=7;m++)begin
  31.                      tr.data[n][m]=sdo_q.pop_back();
  32.                   end
  33.                end
  34.             end   
  35.          end
  36.          repeat(cs_delay) @(vtspi_if.mck);
  37.          sdo_q.delete();
  38. endtask


复制代码


spi要求的时序:
aaa.png
发表于 2019-3-18 10:41:42 | 显示全部楼层
遇到楼主一样的问题,我是不用uvm reg绕开了这个问题,期待高手的解答啊。。。。。
 楼主| 发表于 2019-3-18 16:05:00 | 显示全部楼层


ppeezz 发表于 2019-3-18 10:41
遇到楼主一样的问题,我是不用uvm reg绕开了这个问题,期待高手的解答啊。。。。。 ...


现在也只能不用寄存器读写,而是使用driver直接进行操作
发表于 2019-3-19 15:20:15 | 显示全部楼层

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-5 21:49 , Processed in 0.018135 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表