1.MCDF功能描述
功能描述:
该设计称为多通道数据整形器(MCDF,multi-channel data formatter),它可以将上行(unplik)多个通道数据经过内部的FIFO,最终以数据包(data packet)的形式送出,由于上行数据和下行数据的接口协议不同,将在后面接口描述和时序部分进一步讲解。此外,多通道数据整形器也有寄存器的读写接口,可以支持更多的控制功能。
2.设计结构
从上图的MCDF结构来看主要可以分为如下几个部分:
1.上行数据的通道从端(Channel Slave)
:负责接收上行数据,并且存储到其FIFO中
2.仲裁器(Arbiter)
:可以选择从不同的FIFO中读取数据,进而将数据进一步传送至整形器(formatter)
3.整形器(Formatter)
:将数据按照一定的接口时序送出至下行接收端
4.控制寄存器(Control Registers)
:有专用的寄存器读写接口,负责接收命令并且对MCDF的功能做出修改
3.接口描述
系统信号接口:
CLK(0)
:时钟信号RSTN(0)
:复位信号,低位有效
通道从端接口:
-
CHx_DATA(31:0)
:通道数据输入 -
CHx_VALID(0)
:通道数据有效标志位,高位有效 -
CHx_READY(0)
:通道数据接收信号,高位表示接收成功
整形器接口: -
FMT_ CHID(1:0)
:整形数据包的通道 ID 号 -
FMT_ LENGTH(4:0)
:整形数据包长度信号 -
FMT_ REQ(0)
:整形数据包发送请求 -
FMT_ GRANT(O)
: 整形数据包被允许发送的接受标示 -
FMT_ DATA(31:0)
: 数据输出端口 -
FMT_ START(0)
: 数据包起始标示 -
FMT_ END(0)
:数据包结束标示
控制寄存器接口: -
CMD(1:0)
:寄存器读写命令 -
CMD_ ADDR(7:0)
:寄存器地址 -
CMD_ DATA_ IN(31:0)
:寄存器写入数据 -
CMD_ DATA_OUT(31:0)
:寄存器读出数据
寄存器描述:
地址 0x00 通道 1 控制寄存器 32bits 读写寄存器 -
bit(0)
:通道使能信号。 1 为打开, 0 位关闭。复位值为 1。 -
bit(2:1)
:优先级。 0 为最高, 3 为最低。复位值为 3。 -
bit(5:3)
:数据包长度,解码对应表为, 0 对应长度 4, 1 对应长度 8, 2 对应长度 16, 3 对应长度 32,其它数值(4-7) 均暂时对应长度 32。复位值为 0。 -
bit(31:6)
:保留位,无法写入。复位值为 0。
地址0x04 通道 2 控制寄存器 32bits 读写寄存器
地址 0x08 通道 3 控制寄存器 32bits 读写寄存器
同通道 1 控制寄存器描述。
地址 0x10 通道 1 状态寄存器 32bits 只读寄存器
bit(7:0)
:上行数据从端 FIFO 的可写余量,同 FIFO 的数据余量保持同步变化。复位值为 FIFO的深度数bit(31:8)
:保留位,复位值为 0
地址 0x14 通道 2 状态寄存器 32bits 只读寄存器
地址 0x18 通道 3 状态寄存器 32bits 只读寄存器
4.接口时序
当valid为高,表示要写入数据。
如果该时钟周期ready为高,则表示已经将数据写入;
如果该时钟周期ready为低,则需要等到ready为高的时钟周期才可以将数据写入;
整形接口时序
整形器发送数据是按照数据包的形式发送的,可以选择数据包的长度有 4、 8、 16 和 32。整形器必须完整发送某个通道的数据包后,才可以转而准备发送下一个数据包,在发送数据包期间, fmt_chid
和 fmt_ length
应该保持不变,直到数据包发送完毕。
在整形器准备发送数据包时,首先应该将 fmt_req,置为高,同时等待接收端的 fmt_grant
。当 fmt_grant
变为高时,应该在下一个周期将 fmt_req
置为低。fmt_start
也必须在接收到 fmt_grant
高有效的下一个时钟被置为高,且需要维持一个时钟周期。在 fmt_start
被置为高有效的同一个周期,数据也开始传送, 数据之间不允许有空闲周期,即应该连续发送数据,直到发送完最后一个数据时, fmt_end
也应当被置为高并保持一个时钟周期。
相邻的数据包之间应该至少有一个时钟周期的空闲,即 fmt_end
从高位被拉低以后,至少需要经过一个时钟周期, fmt_req
才可以被再次置为高。
在控制寄存器接口上,需要在每一个时钟解析 cmd
。 cmd
为写指令时,需要把数据cmd_data_in
写入到 cmd_addr
对应的寄存器中;当 cmd
为读指令时,即需要从 cmd_addr
对应的寄存器中读取数据,并在下一个周期,将数据驱动至 cmd_data_out
接口
5.MCDF测试功能点
测试功能点 | 测试内容 | 测试通过标准 | 测试类名 |
---|---|---|---|
寄存器读写测试 | 所有控制寄存器的读写测试;所有状态寄存器的读写测试 | 读写值是否正确 | mcdf_reg_write_read_test |
寄存器稳定性测试 | 非法地址读写;对控制寄存器的保留域进行读写;对状态寄存器进行写操作 | 通过写入和读出,确定寄存器的值时预期值,而不是紊乱值,同时非法寄存器操作也不能影响MCDF的整体功能 | mcdf_reg_illegal_access_test |
数据通道开关测试 | 对每一个数据通道对应的控制寄存器域en配置为0,在关闭状态下测试数据写入是否通过 | 在数据通过关闭情况下,数据无法写入,同时ready信号应该保持为低,表示不接收数据,但又能使得数据不被丢失,因此数据只会停留在数据通道端口 | mcdf_channel_disable_test |
优先级测试 | 将不同数据通道配置为相同或者不同的优先级,在数据通道使能的情况下进行测试 | 如果优先级相同,那么arbiter应该采取轮询机制从各个通道接受数据,如果优先级不同,那么arbiter应该先接收高优先级通道的数据,同时最终所有的数据都应该从MCDF发送出来 | mcdf_arbiter_priority_test |
发包长度测试 | 将不同数据通道随机配置为各自的长度,在数据通道使能的情况下进行测试 | 从formatter发送出来的数据包长度应该同对于通道寄存器的配置值保持一一对应,同时数据也应该保持完整 | mcdf_formatter_length_test |
下行从端低带宽测试 | 将MCDF下行数据接收端设置为小存储量,低带宽的类型,由此使得在由formatter发送出数据之后,下行从端有更多的机会延迟grant信号的置位,用来模拟真实场景 | 在req拉高之后,grant应该在至少两个时钟周期以后拉高,以此来模拟下行从端数据余量不足的情况,当这种激励时序发生10次之后,可以停止测试 | mcdf_formatter_grant_test |
寄存器读写测试
class mcdf_reg_read_write_test extends mcdf_base_test;
function new(string name = "mcdf_data_consistence_basic_test");
super.new(name);
endfunction
task do_reg();
bit[7:0] chnl_rw_addrs[] = '{
`SLV0_RW_ADDR, `SLV1_RW_ADDR, `SLV2_RW_ADDR};
bit[7:0] chnl_ro_addrs[] = '{
`SLV0_R_ADDR, `SLV1_R_ADDR, `SLV2_R_ADDR};
int pwidth = `PAC_LEN_WIDTH + `PRIO_WIDTH + 1;
bit[31:0] check_pattern