译码 译码模块所在的源文件:rtl/core/id.v 译码(id)模块是一个纯组合逻辑电路,主要作用有以下几点: 1.根据指令内容,解析出当前具体是哪一条指令(比如add指令)。 2.根据具体的指令,确定当前指令涉及的寄存器。比如读寄存器是一个还是两个,是否需要写寄存器以及写哪一个寄存器。 3.访问通用寄存器,得到要读的寄存器的值。 译码模块的输入输出信号如下表所示: 以add指令为例来说明如何译码。下图是add指令的编码格式: 可知,add指令被编码成6部分内容。通过第1、4、6这三部分可以唯一确定当前指令是否是add指令。知道是add指令之后,就可以知道add指令需要读两个通用寄存器(rs1和rs2)和写一个通用寄存器(rd)。下面看具体的代码: 第1行,opcode就是指令编码中的第6部分内容。 第3行,`INST_TYPE_R_M的值为7’b0110011。 第4行,funct7是指指令编码中的第1部分内容。 第5行,funct3是指指令编码中的第4部分内容。 第6行,到了这里,第1、4、6这三部分已经译码完毕,已经可以确定当前指令是add指令了。 第7行,设置写寄存器标志为1,表示执行模块结束后的下一个时钟需要写寄存器。 第8行,设置写寄存器地址为rd,rd的值为指令编码里的第5部分内容。 第9行,设置读寄存器1的地址为rs1,rs1的值为指令编码里的第3部分内容。 第10行,设置读寄存器2的地址为rs2,rs2的值为指令编码里的第2部分内容。 其他指令的译码过程是类似的,这里就不重复了。译码模块看起来代码很多,但是大部分代码都是类似的。 译码模块还有个作用是当指令为加载内存指令(比如lw等)时,向总线发出请求访问内存的信号。这部分内容将在总线一节再分析。 译码模块的输出会送到id_ex模块(id_ex.v)的输入,id_ex模块是一个时序电路,作用是将输入的信号打一拍后再输出到执行模块(ex.v)。
|