Synosys ahb vip环境与SINGLE,INCR,WRAP transaction 配置

目录

1.INCR4

2.INCR8

3.INCR16

4.WRAP4

5.WRAP8

6.WRAP16


通过synosys ahb vip搭建1m/1s环境,并发起SINGLE,INCR,WRAP transaction,并发起先写后读测试。

发起single transaction的需要修改cust_svt_ahb_master_transaction.sv以及选择修改的ahb_master_directed_sequence.sv。transaction中有针对于random_sequence的constraint以及burst_type相应的权重,发起单一特定transaction并不需要,可以注释掉。

对于directed_sequence的修改:在原有配置的基础上,修改burst_type以及addr,burst_size一般配置为BURST_SIZE_32BIT,也就是4个Byte。地址的设置一般来说要与一次trans传输的总字节数相对应。在发送INCR4时,传输总字节数为4Byte×4beats=16Byte。

所以地址边界应该有这样的跳变 0×00 => 0×10  => 0×20 ......等等,transaction内部地址每次跳变4,基于以上,对sequence进行设置。

SINGLE和INCR略。

1.INCR4

for(int i = 0; i < sequence_length; i++) begin


      /** Set up the write transaction */
      `uvm_create(write_tran)
      write_tran.cfg          = cfg;
      
      `uvm_rand_send_with (write_tran,
        {  
          write_tran.xact_type    == svt_ahb_transaction::WRITE;
          write_tran.addr         == (32'h0000_0000 | ('h10 * i));
          write_tran.burst_type   == svt_ahb_transaction::INCR4;
          write_tran.burst_size   == svt_ahb_transaction::BURST_SIZE_32BIT;
          foreach (write_tran.data[i]) {
            write_tran.data[i] == i;
          }
        } ) 
      
      /** Wait for the write transaction to complete */
      get_response(rsp);

      `uvm_info("body", "AHB WRITE transaction completed", UVM_LOW);

      /** Set up the read transaction */
      `uvm_create(read_tran)
      read_tran.cfg          = cfg;
      
      `uvm_rand_send_with (read_tran,
        {  
          read_tran.xact_type    == svt_ahb_transaction::READ;
          read_tran.addr         == (32'h0000_0000 | ('h10 * i));
          read_tran.burst_type   == svt_ahb_transaction::INCR4;
          read_tran.burst_size   == svt_ahb_transaction::BURST_SIZE_32BIT;
        } )  
     
      /** Wait for the read transaction to complete */
      get_response(rsp);
    
      `uvm_info("body", "AHB READ transaction completed", UVM_LOW);

`uvm_rand_send_with用于指定随机化时的约束,transaction中的约束是SINGLE,INCR,以及INCR4所以sequence的约束burst_type类型如果是WRAP的话,就会出现error。可以在transaction中添加约束或者注释掉相关约束。

int burst_type_single_wt = 1;
    int burst_type_incr_wt = 1;
    int burst_type_incr4_wt = 1;
    int burst_type_incr8_wt = 1;
    int burst_type_incr16_wt = 1;
    int burst_type_wrap4_wt = 1;
    int burst_type_wrap8_wt = 1;
    int burst_type_wrap16_wt = 1;

  int num_busy_cycles_zero_wt = 500;
  int num_busy_cycles_non_zero_wt = 1;

  /** test delete if need */
  constraint master_constraints{
      burst_type dist{svt_ahb_transaction::SINGLE := burst_type_single_wt,
                      svt_ahb_transaction::INCR   := burst_type_incr_wt,
                      svt_ahb_transaction::INCR4  := burst_type_incr4_wt,
                      svt_ahb_transaction::INCR8  := burst_type_incr8_wt,
                      svt_ahb_transaction::INCR16 := burst_type_incr16_wt,
                      svt_ahb_transaction::WRAP4  := burst_type_wrap4_wt,
                      svt_ahb_transaction::WRAP8  := burst_type_wrap8_wt,
                      svt_ahb_transaction::WRAP16 := burst_type_wrap16_wt
                      };
    foreach (num_busy_cycles[i]) {
      num_busy_cycles[i] dist { 0 := num_busy_cycles_zero_wt, 
                                [1:16] := num_busy_cycles_non_zero_wt};  
                  }
              }
  /** UVM Object Utility macro */
  `uvm_object_utils_begin(cust_svt_ahb_master_transaction)
     `uvm_field_int(burst_type_single_wt,UVM_ALL_ON)
     `uvm_field_int(burst_type_incr_wt ,UVM_ALL_ON)
     `uvm_field_int(burst_type_incr4_wt ,UVM_ALL_ON)
     `uvm_field_int(burst_type_incr8_wt ,UVM_ALL_ON)
     `uvm_field_int(burst_type_incr16_wt ,UVM_ALL_ON)
     `uvm_field_int(burst_type_wrap4_wt ,UVM_ALL_ON)
     `uvm_field_int(burst_type_wrap8_wt ,UVM_ALL_ON)
     `uvm_field_int(burst_type_wrap16_wt ,UVM_ALL_ON)
  `uvm_object_utils_end

INCR4,四节拍递增突发波形图。htrans为2,NONSEQ,代表一次传输的起始。以及读出波形。

2.INCR8

INCR8,8拍递增突发,8beat×4Byte=32Byte,地址边界为0×00 => 0×20 => 0×40......。

for(int i = 0; i < sequence_length; i++) begin


      /** Set up the write transaction */
      `uvm_create(write_tran)
      write_tran.cfg          = cfg;
      
      `uvm_rand_send_with (write_tran,
        {  
          write_tran.xact_type    == svt_ahb_transaction::WRITE;
          write_tran.addr         == (32'h0000_0000 | ('h20 * i));
          write_tran.burst_type   == svt_ahb_transaction::INCR8;
          write_tran.burst_size   == svt_ahb_transaction::BURST_SIZE_32BIT;
          foreach (write_tran.data[i]) {
            write_tran.data[i] == i;
          }
        } ) 
      
      /** Wait for the write transaction to complete */
      get_response(rsp);

      `uvm_info("body", "AHB WRITE transaction completed", UVM_LOW);

      /** Set up the read transaction */
      `uvm_create(read_tran)
      read_tran.cfg          = cfg;
      
      `uvm_rand_send_with (read_tran,
        {  
          read_tran.xact_type    == svt_ahb_transaction::READ;
          read_tran.addr         == (32'h0000_0000 | ('h20 * i));
          read_tran.burst_type   == svt_ahb_transaction::INCR8;
          read_tran.burst_size   == svt_ahb_transaction::BURST_SIZE_32BIT;
        } )  
     
      /** Wait for the read transaction to complete */
      get_response(rsp);
    
      `uvm_info("body", "AHB READ transaction completed", UVM_LOW);

 读

 数据匹配正确。

3.INCR16

4Byte×16beats=64Byte,地址边界跳变为0×00 => 0×40 => 0×80.......等等。

svt_ahb_transaction更改为INCR16,地址write_tran.addr == (32'h0000_0000 | ('h40 * i)),

 以及相应的读出

 数据匹配。

4.WRAP4

4节拍卷绕递增突发,如果突发传输的起始地址没有与突发传输的总字节数对其,那么当传输到地址边界下界时,传输地址讲卷绕回地址边界上界。为说明是卷绕突发,将起始地址写为0000_0008

8%16=8,边界不对齐。

spec上的WRAP4传输波形图:

 得到的相关波形图:

 地址边界变化为0×00 => 0×10 => 0×20 => 0×30 => 0×40....,0×38,0×3C传输完成后,下一次传输便是地址的下界,根据WRAP特点,会卷绕回地址的上届也就是0×30,然后0×34。

5.WRAP8

WRAP8要比WRAP4有趣些。先确定其地址边界为0×00 => 0×20 => 0×40......,按照INCR8更改地址,burst_type换成WRAP8。

WRAP8的spec波形图:

 

 

 第一个transaction中,传输到1C时,下一beat就会触发地址下界0×20,所以卷绕回地址上界0×00,继续传输。第二个transaction中,触发了地址下界0×40,卷回地址上界0×20。

6.WRAP16

更改burst_type以及地址。地址边界为0×00 => 0×40 => 0×80......

在传输触碰到0×40的地址边界后,卷回到0×00。

 这次传输触碰到0×80地址边界,卷回到上界0×40。

以上是AHB协议的8钟传输以及先写后读测试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值