将陆续上传新书《自己动手写CPU》,今天是第48篇。
9.8 修改OpenMIPS以实现ll、sc指令
9.8.1 LLbit寄存器的实现
LLbit寄存器在LLbit模块中实现,模块接口如图9-30所示,各接口描述如表9-8所示。
LLbit寄存器的代码如下,源文件是本书光盘Code\Chapter9_2目录下的LLbit_reg.v文件。
module LLbit_reg(
input wire clk,
input wire rst,
// 异常是否发生,为1表示异常发生,为0表示没有异常
input wire flush,
// 写操作
input wire LLbit_i,
input wire we,
// LLbit寄存器的值
output reg LLbit_o
);
always @ (posedge clk) begin
if (rst == `RstEnable) begin
LLbit_o <= 1'b0;
end else if((flush == 1'b1)) begin //如果异常发生,那么设置LLbit_o为0
LLbit_o <= 1'b0;
end else if((we == `WriteEnable)) begin
LLbit_o <= LLbit_i;
end
end
endmodule
当有异常发生时,会使得LLbit寄存器的值为0。所以此处有一个输入接口flush,当flush为1时,表示有异常发生(在第11章实现异常处理的时候会详细介绍),从而设置LLbit寄存器的值为0。
9.8.2 修改译码阶段的ID模块
在译码阶段的ID模块要增加对ll、sc指令的译码,根据图9-28给出的ll、sc指令格式可得,确定ll、sc指令的过程如图9-31所示。
其中涉及的宏定义如下,正是ll、sc指令的指令码,在本书附带光盘Code\Chapter9_2目录下的defines.v文件可以找到这些定义。
`define EXE_L