本文作为SpinalHDL学习笔记第十七篇,记录使用SpinalHDL模块库的一些实用工具。
SpinalHDL学习笔记总纲链接如下:
目录:
1.免状态工具
2.全状态工具
3.特殊工具
1.免状态工具
语法 | 返回类型 | 描述 |
---|---|---|
toGray(x : UInt) | 位 | 返回从 x (UInt) 转换而来的灰度值 |
fromGray(x : Bits) | UInt | 返回从 x (灰度) 转换而来的 UInt 值 |
Reverse(x : T) | T | 翻转所有位 (lsb + n -> msb - n) |
OHToUInt(x :Seq[Bool]) | UInt | 返回 x 中唯一被设置(为 1)的比特位的索引 |
CountOne(x : Seq[Bool]) | UInt | 返回 x 中被设为 1 的位数 |
MajorityVote(x :Seq[Bool]) | Bool | 如果设置为 1 的位数 > x.size / 2,则返回 True |
EndiannessSwap(that: | T | 大端 <-> 小端 |
OHMasking.frst(x : Bits) | 位 | 对 x 应用掩码以仅保留第一个设为 1 的位 |
OHMasking.last(x : Bits) | 位 | 对 x 应用掩码以仅保留最后一个设为 1 的位 |
OHMasking.roundRobin( | 位 | 对 x 应用掩码以仅保留 requests 中设置 1 的位。 |
MuxOH ( | T | 根据 oneHot 向量从 inputs 中返回多路复用的 T 。 |
PriorityMux ( | T | 返回第一个其 sel 为 True 的 in 元素。 |
PriorityMux ( | T | 返回第一个其 sel 为 True 的 in 元素。 |
2.全状态工具
语法 | 返 回 类型 | 描述 |
---|---|---|
Delay(that: T, cycleCount: Int) | T | 返回延迟了 cycleCount 周期的 that |
History(that: T, length: Int[,when : | List[T] | 返回长度为 length 的 Vec其第一个元素是 that ,最后一个元素是延迟了length-1 的 “that“内部移位寄存器会在 when 有效时采样 |
BufferCC(input : T) | T | 返回利用两个触发器同步到当前时钟域的同步输入信号 |
计数器
计数器工具可用于轻松实例化硬件计数器。
实例化语法 | 备注 |
Counter(start: BigInt, end:BigInt[, inc : Bool]) | |
Counter(range : Range[, inc :Bool]) | 与 x to y x until y 语法兼容 |
Counter(stateCount: BigInt[, inc :Bool]) | 从 0 开始,到 stateCount - 1 结束 |
Counter(bitCount: BitCount[, inc :Bool]) | 从 0 开始到 (1 << bitCount) - 1 结束 |
计数器可以通过方法控制,并且可以连线可以被读取:
val counter = Counter(2 to 9) // Creates a counter of 8 states (2 to 9)
// Methods
counter.clear() // Resets the counter
counter.increment() // Increments the counter
// Wires
counter.value // Current value
counter.valueNext // Next value
counter.willOverflow // True if the counter overflows this cycle
counter.willOverflowIfInc // True if the counter would overflow this cycle if␣,→an increment was done
// Cast
when(counter === 5){ ... } // counter is implicitly casted to its current value
当 Counter 溢出(达到最终值)时,它会重新启动下一个周期并设置为起始值。
Note:目前仅支持向上计数器。
CounterFreeRun 构建一个始终运行的计数器: CounterFreeRun(stateCount: BigInt) 。
超时
超时工具可用于方便地实例化一个硬件超时。
实例化语法 | 备注 |
---|---|
Timeout(cycles : BigInt) | 在 cycles 个时钟后标记 |
Timeout(time : TimeNumber) | 在持续 time 时间后标记 |
Timeout(frequency : HertzNumber) | 以“frequency“频率进行标记 |
下方是可以与 Counter 工具一起使用的不同语法句式的示例:
val timeout = Timeout(10 ms) //Timeout who tick after 10 ms
when(timeout) { //Check if the timeout has tick
timeout.clear() //Ask the timeout to clear its flag
}
Note: 如果使用时间或频率设置实例化 Timeout ,则隐含地 ClockDomain 应该具有频率设置。
复位控制
复位控制 (ResetCtrl) 提供了一些实用工具来管理复位。
asyncAssertSyncDeassert
可 以 使 用 异 步 有 效 同 步 无 效 逻 辑 来 筛 选 异 步 复 位。 为 此可 以 使 用 ResetCtrl.
asyncAssertSyncDeassert 函数返回筛选后的值。
参数名称 | 类型 | 描述 |
---|---|---|
input | Bool | 被筛选的信号 |
clockDomain | ClockDomain | 返回将使用所筛选值的时钟域 (ClockDomain) |
inputPolarity | Polarity | HIGH/LOW (default=HIGH) |
outputPolarity | Polarity | HIGH/LOW (default=clockDomain.confg.resetActiveLevel) |
bufferDepth | Int | 防止亚稳态所需的寄存器级数(默认为 2) |
另外还有一个 ResetCtrl.asyncAssertSyncDeassertDrive 版本的工具,它直接使用筛选后的值
为 clockDomain 的复位赋值。
3.特殊工具
语法 | 返 回 类型 | 描述 |
---|---|---|
LatencyAnalysis(paths : Node*) | Int | 以周期为单位返回经过所有节点的最短路径, |