图 1. 从串流接口动态获取

描述
MicroBlaze V 会读取由 rs2 中 4 个最低有效位定义的链路,并将结果置于寄存器 rD 内。
GETD 指令有 32 种变体。
阻塞版本(当 n 位为 0 时)会保持停滞直至确认来自接口的数据有效为止。非阻塞版本不会停滞,如果数据有效,则将 mstream 中的 C 位设为 0,如果数据无效,则将 C 位设为 1。对于无效访问,目标寄存器的内容会保持未定义状态。
所有数据 GETD 指令(当 c 位为 0 时)都预判接口的控制位为 0。如果情况有变,则该指令会将 mstream 中的 FSL 位设为 1。所有控制 GETD 指令(当 c 位为 1 时)都预判接口的控制位为 1。如果情况有变,则该指令会将 mstream 中的 FSL 位设为 1。仅当传输有效数据时,FSL 位才会置位。
异常版本(当 e 位为 1 时)会在发生控制位不匹配时生成异常。生成异常时,目标寄存器不会更新。
测试版本(当 t 位为 1 时)照常处理,但链路的读取信号不会断言有效。
机器外部中断或外部断点无法中断原子版本(当 a 位为 1 时)。每条原子指令都会防止后续指令被中断。这意味着可以将一连串原子指令组合在一起,不会发生中断而打断程序流程。但仍有可能发生异常。
如果由 C_FSL_LINKS 置位的可用链路数量小于或等于 rs2 中的 4 个最低有效位,那么当 C_ILL_INSTR_EXCEPTION = 2 时,会发生违规指令异常,否则该指令行为与 NOP 相似。
伪代码
x ← rs2[3:0]
if x >= C_FSL_LINKS then
if C_ILL_INSTR_EXCEPTION = 2 then
PC ← mtvec
mcause ← 2
else
(rD) ← Sx_AXIS_TDATA
if n = 1 then
mstream.C ← Sx_AXIS_TVALID
if Sx_AXIS_TLAST ≠ c and Sx_AXIS_TVALID then
mstream.FSL ← 1
if (e = 1) then
PC ← mtvec
mcause ← 24
更改的寄存器
- rD,除非生成异常,生成异常时寄存器保持不变。
- mstream,stream(当
C_USE_MMU> 0 时) - PC 和 mcause(当生成串流异常或违规指令异常时)。
时延
- 1 个周期,
C_OPTIMIZATION= 0、2 或 3 - 2 个周期,
C_OPTIMIZATION= 1
该指令的阻塞版本会使流水线停滞,直至完成该指令为止。当参数 C_USE_EXTENDED_FSL_INSTR 设为 1 时,将提供中断服务,且指令不是原子指令。
注释
- 使用 RV64 时,从链路读取的 32 位数据将采用零位扩展。
- 除非
C_FSL_EXCEPTION设为 1,否则 e 位没有任何作用。 - 仅当参数
C_FSL_LINKS大于 0 时,才能使用这些指令。 - 仅当参数
C_USE_EXTENDED_FSL_INSTR设为 1 时,才能使用扩展指令(异常、测试和原子版本)。 - 对指令进行解码时,会忽略指令位 15-19 和 25-26,例外情况是在使用扩展地址指令时会检查位 25。
- AXI4-Stream 提供了一个 FIFO 输入寄存器,允许先在接口上完成一项传输事务,然后再执行 GET 指令。