https://mp.weixin.qq.com/s/0ob-Fq-ZOoj-_S7pTJu6rQ
介绍TLArbiter的实现,主要关注如何实现burst的多个beat的输出。
1. beatsIn/sourcesIn
对输入参数进行简单处理。输入参数为:
sources为不定参数:
二元组第一个元素为所需时钟周期即心跳(beat)的个数,第二个元素为输入的DecoupledIO。
2. beatsLeft
剩余的beat数:
3. idle
如果剩余的beat数为0,则Arbiter空闲(idle):
4. latch
是否可以把beat数目的初始值存入beatsLeft中:
使用方式:
5. valids/readys
a. 获取sources的valid信号;
b. 根据policy生成ready信号,以决定哪一个source可以输出;
6. winner
标志着每一个source是否可以输出:
winner为真需要满足两个条件:
a. valid为真:需要输出;
b. ready为真:允许输出;
7. initBeats
计算beatsLeft的初始值:
a. 根据是否是winner输出每一个source的beats值;
b. 取出仲裁胜出者需要的beats值;
c. 根据latch的值,选择把初始值存入beatsLeft,还是在输出时减一;
d. 只有在输出时beatsLeft才减一:beatsLeft - sink.fire();
8. state
记录sources的状态:
如果idle为真,则把仲裁结果winner在下一个时钟周期存入state中;否则state保持不变。
9. allowed
是否允许source输出:
如果idle为真,则是否允许输出由仲裁结果readys决定;否则当前burst的beats还没有传输完毕,是否允许由state决定,即只允许当前正在传输的source进行输出。
10. sink.valid
如果idle为真,则由valids决定;否则由正在进行传输的source的valid决定。
11. sink.bits
似乎有点问题,muxState可能为全0,而Mux1H要求muxState中有且只有一个1。这里不深入讨论。