资讯详情

电力电子转战数字IC20220721day54——SV实验4+UVM实验3

在开始uvm在实验3之前,我对之前的水平没有印象。我又看了一遍实验4,大致可以理解。

不懂的时候继续往前走,蓦然回首,会更清晰。

硬件

硬件部分分为四个组件,即slave_fifo,arbiter, formater,register

slave_fifo

功能:接收三个channel并存储数据fifo中

时序:valid为高且ready为高写入数据,valid为高但ready为低则等待ready为高再写

这里写硬件module当三个通道的信号可以用x来表示通用

  • 程序解读
    1. 共6输入5输出的声明端口:clk和rstn不用多说,chx_data_i输入的数据,chx_valid_i同时,数据可以在高时同时chx_ready_o以上是4个输入和1个输出,来自高数据arbiter的a2sx_ack_i告诉这里哪个通道可以读取数据arbiter。
    2. 内部变量声明:因为需要同步fifo,读写指针和缓存寄存器(前宽后深)需要声明,fifo第二个关键点是空满标志,wire声明后assign;剩余空间data_cnt_s,同时也assign给margin_o;a2sx_ack_i被assign给rd_en_s,表示可读。
    3. 关于chx_ready_o的always块:fifo不满,寄存器说可以写(slvx_en_i为高),chx_ready_o为高
    4. slvx_req_o:复位信号低,0;否则,只要fifo不空slvx_req_o就是1,你可以去arbiter请求读取数据
    5. 读写指针 读写数据:直接写指针(而不是地址)mem[]中;在rstn arbiter说可读rd_en_s 不空时读数据,在rsnt chx_valid_i chx_ready_o 寄存器说可以写slvx_en_i时写入
    6. slvx_val_o:输出到arbiter的信号,收到arb可读信号rd_en_s且对应fifo不空时是有效数据,slvx_val_o为高

arbiter

功能:根据寄存器

时序:

  • 程序解读
    1. 声明端口:与寄存器连接,寄存器给过来通道的优先级slvx_prio_i以及数据包的长度slvx_pkglen_i;和上面的slave_fifo连接,输入数据 slvx_req_o slvx_val_o,输出a2sx_ack_i;和formater连接,输出有效信号a2f_val_o 通道id a2f_id_o 数据a2f_data_o 数据包长度a2f_pkglen_sel_o
    2. 通道选择:因为三个fifo只要不空slvx_req_o也就是说,最多会有三个通道同时要求arb阅读数据取决于谁的优先级slvx_prio_i更大的话,选择通道的寄存器id_sel_r赋对应的id,然后将数据包长度slvx_pkglen_i输出寄存器a2f_pkglen_sel_r
    3. 只要通道id、slvx_val_o、slvx_data_i任何变化赋值输出

formater

功能:接收寄存器指令arbiter来的数据及其id等等,发送指定长度的数据包

时序:准备发送数据包时,fmt_req_o置高,等待fmt_grant_i下一个周期是高位置fmt_req_o置低同时fmt_start_o高度并保持一个clk,这时,数据开始发送,同时发送数据fmt_end_o也置高,数据发送完成fmt_end_o也置低。至少一个相邻间至少有一个相邻数据包clk,fmt_req_o才可被置高

  • 代码解读
    1. 端口声明:从arb三个输出作为输入a2f_val_i,a2f_id_i,a2f_data_i;从寄存器过来的pkglen_sel_i;数据信号开始传输fmt_grant_i;输出数据和传输数据所需的信号fmt_chid_o,fmt_length_o,fmt_data_o、fmt_start_o,fmt_end_o
    2. 数据包长度length_r:根据寄存器信号pkglen_sel_i确定相应的长度
    3. fmt内部fifo写入指针:根据arb给过来的a2f_id_i,若有效a2f_val_i | 内部buffer有效buffer0_val_r且fmt要求fmt_ack_r,将相应的写入指针 也就是说,写一个数据
    4. fmt内部fifo与slave的buffer:根据buffer有效位和fmt要求位,将slave的buffer给出缓存数据fmt_fifo;根据arb数据有效位和fmt不需要发送,缓存数据slave_buffer里
    5. fmt内部fifo阅读指针:根据fmt_send_r,每次发送一次加1,
    6. fmt内部fifo读数据:根据fmt_send_r,将内部fifo输出相应地址的数据
    7. 有限状态机完成各种动作状态:req,wait_grant,start,send,end,idle
    8. 配置状态机各状态下的信号

register

功能:根据指令cmd配置mcdf的功能

时序:目前有三个指令,对应不同的地址,写指令clk可以写,读指令

地址0x00、0x04、0x08分别对应32bits读写寄存器的三个通道;地址0x10、0x14、0x18分别对应32bits只读寄存器的三个通道;

对于读写寄存器,第0位是通道使能信号,复位值1;1-2位是优先级,0最高,复位值3最小;3-5位存储数据包长度,0123位为4、8、16、32、4-7位,复位值为0;6-31位不能写,复位值为0。

0-7位表示只读寄存器fifo可写余量,和fifo保持同步变化,复位值为fifo深度32;8-31位是保留位,复位值是0。

  • 代码解读
    1. 端口声明:输入指令cmd及其地址addr,及其数据data,输入三个fifo的margin为slvx_margin_i;输出优先级slvx_prio_o,通道使能slvx_en_o,数据包长度slvx_pkglen_o,数据cmd_data_o
    2. 内置mem追踪fifo余量:mem5-3位分别存储通道2-0fifo余量,由于只读寄存器的描述,高24位为0,低7-0存储slvx_margin_i
    3. 内置mem读写寄存器-写指令:mem根据指令地址的2-0位cmd_addr_i存储通道2-0读写寄存器的数据cmd_data_i,存储输入的数据高26位为保留位0,低5-0位cmd_data_i
    4. 阅读指令:指令是阅读READ根据指令地址cmd_addr_i对应地址mem,也就是说,6个取一个给输出端cmd_data_reg

软件

给硬件的各个部分做一个package

  • chnl_pkg

    1. trans事务:包含数据data、id、间隔;约束;克隆;打印;
    2. driver:通过mailbox获取trans的句柄req,将数据传输到输出端,信号由接口包裹
    3. generator:例化了两个mailbox和trans的句柄req,因为需要约束;将trans数值赋给mailbox
    4. monitor:检测输出端数据,放入邮箱
    5. agent:例化了driver和monitor,并连接接口,执行各自的接口run任务
  • arb_pkg

    为空,组件类型仍然相同

  • fmt_pkg

    1. trans事务:包含数据data、id、由于克隆和compare可以用uvm实现,这里不再赘述,
    2. driver:内置邮箱模拟下行fifo;一样是通过mailbox获取trans的句柄req,根据trans中fifo配置深度和带宽
    3. generator:例化了两个mailbox和trans的句柄req,做约束;将trans数值赋给mailbox
    4. monitor:检测输出端数据,放入邮箱
    5. agent:例化了driver和monitor,并连接接口,执行各自的接口run任务
  • mcdf_pkg

    1. mcdf_refmodel:模拟mcdf硬件行为,包括复位、更新寄存器数据包装三个通道的数据
    2. mcdf_checker:例化所有mailbox,把对应mailbox的trans给到refmod,把refmod输出端mailbox给出预期的邮箱;比较monitor采集到的trans和期望的是否一致,记录错误数量
    3. mcdf_env:例化所有agent,让所有pkg的agent运行起来
    4. mcdf_base_test:例化nv、所有generator,把mailbox传递给driver的信箱,让env运行起来
    5. mcdf_data_consistence_basic_test
  • rpt_pkg

    利用uvm的信息机制就可以替代,这里忽略

  • tb

    1. 接口:输入端chnl_intf,寄存器端reg_intf,仲裁器端arb_intf,整形器端fmt_intf,整个mcdf的mcdf_intf;每个接口都有两个时钟块,drv和mon
    2. tb:接口连接;植入各个pkg,连接接口

UVM 实验3——TLM通信和回调函数

主要就是将原本用mailbox进行传递信号的部分全部替换成tlm端口,除了generator。用tlm通信管道替换了refmod里面的三个输出端mailbox,并用其自带端口进行通信。然后是利用回调函数进行test的延伸扩展。最后将利用uvm_root类配置一些仿真参数,配置了信息冗余度、仿真退出count、仿真最大时间长度。

标签: 0123连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台