2.1.1 -2【MCDT 结构、波形、代码】

MCDT 设计结构

在 mcdt 里面没有优先级了, mcdf 寄存器有优先级,没有优先级先看端口。 端口是3个slave 的 chnl , chnl 有进来的数据(valid , data , ready 信号),
在这里插入图片描述
在这里插入图片描述
数据能否发送成功在下行端,当下行不接受数据时,就会拉低 ready 信号,跟下行之间每一拍的数据 不需要有额外的延迟 去做采样、判断, 必须在当前这一拍就给反馈。 当 valid 和 data 有信号时, slave 要判断当前是否可以写入, 若不能写入(fifo 写满), 那ready 信号就要拉低, ready 拉低的情况时, 这一拍的数据 D3 必须要保持, 因为不保持当前的数据就会丢失,

Arbiter 在没有优先级的情况下怎么判断? 看设计代码

讲时序 lab2

只看激励,通过激励理解设计的行为

  • dump -add /* depth 0

  • run

    ready 信号一直拉高, 因为 fifo 最开始为空, 3个 chnl 同时流入数据,流入 fifo , arbiter 可以一直接收, 故 ready 信号一直为高 , 但 margin fifo的余量一直在减少, 流进多 流出少。

先从结构 , 再看端口, 再看时序, 通过时序理解设计的行为,来理解 slave 和 fifo 在一起设计行为是什么样, 再理解 arbiter ,理解层次结构。

设计代码中的 input 在真实中来自外部。 对于验证mcdt 而言 外部源来自激励

芯片做了 2 件事情,一个是数据的运算, 一个是数据的搬迁, 搬迁到下一个需要数据的地方,

传输数据需要数据总线,

MCDT 代码和波形理解

讲代码细节,从端口着手
单时钟, 3 个 chx ,formatter

ch0_margin_0[5:0] 信号来自 mcdt/v1/slave_fifo.v

![在这里插入图片描述](https://img-blog.csdnimg.cn/b6d32a14535c4d84a8e53f8a8d772e27.pn

在这里插入图片描述
chx 跟着 dut 边界走

在这里插入图片描述
slvx 信号跟 arbiter 有连接关系

mcdt

在这里插入图片描述
mcdt 中 margin 信号与 fifo 相连, 因为 mcdt 中没有寄存器, fifo 想表示剩余多少存量

在这里插入图片描述

chx_valid_i, 跟着外部接口slave, slv1_data_s, chl_margin_o ,
在这里插入图片描述

slv0/1/2 表示 slave 来数据了, a2s0/1/2_ack_o 选择从哪个 slave 读数据, 选择后对应的 数据被送进来, 送进来之后再送出去。 在某一拍如果 3个 slave 同时请求的时候,arbiter 只允许 1 个通过,因为 arbiter 内部没有缓存 没有做 buff 设计

看波形理解设计

在这里插入图片描述

3 个 margin 一开始都是空的

slv0/1/2_req_i 是 arbiter 的输入, 是 slave 的输出
在这里插入图片描述

  • 对 slave 而言 , mcdt 端口的数据进入 slave, 下一拍 slave 0 采到数据, 采到之后 margin 从32 变成 31 了 , 同时 slvx_req_o 通知 arbiter 要发送数据了, 能不能通过 要看 ack 信号, ack 信号在下一拍来, 当前这一拍通知 arbiter ,arbiter 下一拍通知 slave , 收到通知紧接着就把数据送出来了。
    在这里插入图片描述
    在这里插入图片描述

  • 对 arbiter 而言, slvx_req_o 已经拉高了 准备请求数据 , slvx_req_i 输入状态 ,同时 slv1/2 也是进来数据的 , 进来数据以后, 每一拍 只允许一个 ack 信号拉高, 通知相应的 slave_fifo , arb_data_o 数据也是先给了 slv0 ,下一拍 slv0 的数据就出来了 ,因为下一拍 slv0_vai_i 和 slv0_data_i 都来了 ,来了之后就把 slv0_vai_i , slv0_data_i 送到端口上
    在这里插入图片描述

在这里插入图片描述

FIFO

fifo 进来的逻辑,
在这里插入图片描述

读数据从 arbiter 读 。 ed_en_s 是 arbiter 的信号 , 且 empty_s 不为空, 就将当前的数据交出去。
在这里插入图片描述

在这里插入图片描述
chx_valid_i 为高, 且 chx_ready_o 为高, wr_pointer_r 加 1 。

在这里插入图片描述

~ wr_pointer 为什么取反? wr_pointer , rd_pointer, 复位后一开始给0 , 给0后 一开始的状态是 empty_s ,一开始就只能写。 因为 fifo 的深度是 32 个 , 要二进制表达它的话 就是 10 0000, 当写到 10 0000 的时候, 32 个数都占完了, 所以 wr_pointer , rd_pointer 用6位数来表示

假如高位 wr_pointer[5] = 0, wr_pointer[4:0] = rd_pointer 这个数一直没有变, 那么 rd_pointer = 00_0000 ,相当于定向测试, 最高位取反, 用来判断与 rd_pointer 是否正好相差 32 位。

data_cnt_s 还能多少数据

a2sx_ack_i 从 arbiter 交给 fifo 的, 表示 arbiter 读数了

在这里插入图片描述

fifo 不会轻易写满, 数据正常进来, arbiter 读就有数据出

在这里插入图片描述
mcdf 中 margin 信号送到寄存器上

arbiter

在这里插入图片描述

arbiter 状态机 , 一开始是 IDLE 状态, 默认 slv0 高, 如果接下来还有请求 优先给 slv1 ,

c_state 把状态 给 ack 信号, 在同一拍的时候 只可能有 1个 ack 信号
在这里插入图片描述

是一个组合逻辑, 当 slv0/1/2_val_i 信号来了以后 001, 010, 100, 同一时刻不可能有 2个 valid 信号拉高

处理 000 时的意外

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值