MCDF: 寄存器模块,上行通道模块,Arbiter仲裁模块,数据整形模块
功能:MCDF(Multi-Channel Data Formatter)多通道数据整形器将上行多个通道数据存入FIFO,经过Arbiter仲裁(优先级,轮询机制),完成指定通道的数据打包,寄存器(APB总线)可以控制各个通道的开关、优先级以及数据包长度
寄存器:读写:上行通道开关SLV_EN(3:0),初始态 4'b0000
奇偶校验清零Parity_err_clr(3:0),初始态 4'b0000
上行通道标识SLVX_ID(7:0),初始态 8'b03020100
数据打包长度SLVX_LEN(7:0),初始态 8'b00000000
只读:FIFO余量,初始态 32’h20 (32深度)
奇偶校验出错,初始态 0
测试点:复位值测试(内建测试seq;DUT 复位, RAL 复位后 mirror(CHEACK功能)函数自动检查DUT复位值与RAL复位值是否一致)
读写测试(内建测试SEQ;前门写后门读等,只读寄存器只能后面写;)
翻转测试(内建测试SEQ;进行读写,FFFF,0000, 5A5A,A5A5等)
难点:
APB总线VIP开发: ① 环境搭建(master agent,slave agent)
② 时序分析 (setup, enable阶段;mst与slv时序不同,slv滞后一拍)
③ 验证策略(进行读写功能测试;slv端用关联数组模拟接受数据,并发出响应;mst端先用关联数组记录写入的数据,之后在与读出数据进行对比)
④ 时序检查(SVA检查时序及功能)
功能:1) psel,penable, cross(idle, setup, enable)
2) pwrite (write,read),cross pwrite,psel
3) 传输类型:single,burst
4)读写功能:写读,写写,读写,读读
时序:psel为高时,paddr不可以为X值
Psel拉高下一个周期,penable拉高
Penable和pready为高时,下一周期penable拉低
Psel和pwrite为高时,pwdata保持不变
在下一次传输前,上一次的paddr和pwrite保持不变(低功耗)
Penable 和pready为高同一周期,prdata应该发生变化
上行通道:data(31:0),data_parity,vaild,wait,parity_err
难点:环境搭建;TLM通信;时序问题,先用seq_item_port.get_next_item阻塞来获取req,但获取的item如果该通道开关没开,则一直等待不到wait,无法执行seq_item_port.item_done,数据发生会出现挂死现象。解决办法,在发送激励时先判断通道开关情况,解决办法:①通过p_sequencer获取apb_interface的开关通道 ②通过config_db#()配置到seq组件③通过RAL直接调用
Arbiter仲裁:轮询机制(复位值通道3优先级最高,每次获取数据时优先级向右侧移动一位),按照优先级(每次获取时都是按照最高优先级,直到最高优先级通道FIFO没数据,才会转移到下一优先级)
数据整形模块formatter:pkg_vaild, pkg_fst, pkg_data(31:0), pkg_lst, rev_rdy(数据包可以通过rev_rdy拉低来延迟,采样也通过vaild与rev_rdy同时为高踩有效)
难点:该模块主要负责采集整形数据,送给scoreboard与上行通道发送到数据进行对比。其次,需要模拟下行通道来收集formatter打包的数据,采用不同深度(可配置)的FIFO来模拟下行端口接受formatter的数据包,以及响应rev_rdy信号
下行端口接收情况:当formatter的valid信号有效时,表明打包数据已准备好,当下行端口的FIFO有余量时就可以采集信号并反馈rev_rdy有效(默认为0),当下行端口FIFO没有余量时,则继续等待下一周期;
下行端口发送情况:随机几个周期从FIFO取出一个数据;
Reference modle:采集上行通道数据,根据formatter打包数据规则进行模拟打包
难点:1.将每个通道检测到的数据分别打包(通过RAL来获取len长度进行打包),再依据formatter检测到的数据包来选择通道,这就省去了优先级情况
2.采用TLM fifo 来通信,上行通道的数据都在FIFO中,没有时序要求,合适取出数据打包成为问题?采用阻塞(get/peek)办法,只要FIFO有数据,就将FIFO里数据取出并打包