我正在设计 MIPS 处理器作为我的个人项目,现在我遇到了一个非常困惑的问题。我只是无法总结何时在 MIPS 中使用有符号扩展以及何时使用零扩展。
我搜索了很多资源,主要是说:
1) ADDI, ADDIU 都是使用signed-extend。
2) ANDI、ORI、XORI 都使用零扩展。
但是,在这两条指令中,我开始感到困惑:
SLTIU/SLTI
在 Imagination 的“程序员的 MIPS 架构第 II-A 卷:MIPS 指令集手册”第 368 页中说:

它清楚地提到16位立即数是signed-extend。但我不明白以下语句:
[0, 32767] 或最大 [max_unsigned-32767, max_unsigned] 无符号范围的结尾。
其他一些人说 16 位立即数是零扩展,如下所示:

那么,有人可以解释一下 MIPS 中的有符号指令和无符号指令之间究竟有什么区别吗?
assembly mips system-verilog zero-extension immediate-operand
我理解在systemverilog中使用case语法时,我们需要完全描述所有组合或添加默认值以避免锁存.
这是我的示例代码,没有生成锁存器:
module test(
input logic[2:0] op,
output logic a,b,c
);
always_comb
begin
case(op)
0: {a,b,c} = {1'b1,1'b1,1'b0};
1: {a,b,c} = {1'b1,1'b0,1'b0};
2: {a,b,c} = {1'b0,1'b1,1'b0};
default: {a,b,c} = {1'b0,1'b0,1'b0};
endcase
end
endmodule
Run Code Online (Sandbox Code Playgroud)
正如我在开头所说,如果添加默认值,则不会生成锁存器.请查看第二个代码,这是一个ALU设计:
module ALU(
output logic[31:0] Result,
output logic Zero, Overflow, Negative, Carryout,
input logic [5:0]ALUOp_i,
input logic [31:0] ALU_A_i, ALU_B_i,
input logic [4:0] Shamt
);
logic [31:0] adder_b;
always_comb
begin
casez(ALUOp_i)
/*Add_trap*/ 0,1: {Carryout,Result} = {ALU_A_i[31],ALU_A_i} + {ALU_B_i[31],ALU_B_i};
/*Add_notrap*/
/*Subtrap*/ 2,3:
/*Sub_notrap*/ begin
adder_b = ALU_B_i ^ …Run Code Online (Sandbox Code Playgroud)