如何为 SRA 指令综合硬件
How to synthesize hardware for SRA instruction
我应该如何设计我的 SRA MIPS R3000 指令,它按移位量对 Reg[rt] 进行算术移位。偏移量始终是变量而不是常量,所以我只关心如何在代码中指定它以使其在 Systemverilog 中编写时可综合。因为一个变量不能合成,除非它的值是已知的。如果我的问题不对请指正。
右移字运算 SRA:
寄存器 rt 右移 shamt 位,符号扩展
高位。
结果放在寄存器 rd.
module ALU_SRA(
input logic signed [31:0] rs,
input logic signed [31:0] instr,
input logic signed [31:0] rt,
input logic signed [4:0] shamt,
output logic signed [31:0] out);
assign out = {`shamt{rt[31]}, rt >> shamt};
endmodule
如果你想在一个周期内移动它,那么你可以这样做:example
这将进行综合,但您应该检查它是否符合您的时序要求。如果您需要扩展 shamt 端口,那么您需要编写另一个移位函数。无论如何,如果你不需要在一个周期内移位,那么你应该在每次调用移位函数之间添加寄存器以获得更好的时间。
使用算术右移:
assign out = rt >>> shamt;
的 11.4.10 移位运算符 部分
我应该如何设计我的 SRA MIPS R3000 指令,它按移位量对 Reg[rt] 进行算术移位。偏移量始终是变量而不是常量,所以我只关心如何在代码中指定它以使其在 Systemverilog 中编写时可综合。因为一个变量不能合成,除非它的值是已知的。如果我的问题不对请指正。
右移字运算 SRA: 寄存器 rt 右移 shamt 位,符号扩展 高位。 结果放在寄存器 rd.
module ALU_SRA(
input logic signed [31:0] rs,
input logic signed [31:0] instr,
input logic signed [31:0] rt,
input logic signed [4:0] shamt,
output logic signed [31:0] out);
assign out = {`shamt{rt[31]}, rt >> shamt};
endmodule
如果你想在一个周期内移动它,那么你可以这样做:example
这将进行综合,但您应该检查它是否符合您的时序要求。如果您需要扩展 shamt 端口,那么您需要编写另一个移位函数。无论如何,如果你不需要在一个周期内移位,那么你应该在每次调用移位函数之间添加寄存器以获得更好的时间。
使用算术右移:
assign out = rt >>> shamt;
的 11.4.10 移位运算符 部分