Rocket - tilelink - TLArbiter

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。这里不深入讨论。
 
posted @ 2019-07-17 07:11  wjcdx  阅读(393)  评论(0编辑  收藏  举报