1单选(2分)
在单总线数据通路实验中,运算过程是通过_________产生ALUop、RXce等一系列控制信号完成的,这次实验的运算过程通过______控制信号完成。
得分/总分
A.开关手工输入,存储器产生
B.存储器产生,开关手工输入
C.硬布线控制器产生,开关手工输入
D.开关手工输入,硬布线控制器产生
正确答案:D
2单选(2分)
我们为这个实验设计的指令系统中,指令字占_______个二进制位,分为_______个字段。
_______是指令操作码OPCODE,用来区分指令的功能;
_______用来指示目的操作数的寄存器号 ;
IR[7:4]的作用是_______。
得分/总分
A.14,5,IR[3:0],IR[13:12],提供立即数DATA
B.12,5,IR[9:6],IR[11:10],指示源操作数的寄存器号
C.12,4,IR[9:6],IR[7:6],指示源操作数的寄存器号或者提供立即数DATA
D.14,4,IR[3:0],IR[9:8],提供立即数DATA
正确答案:A
3多选(3分)
实验设计了哪几种类型的指令
得分/总分
A.R型
B.B型
C.U型
D.I型
正确答案:A、D
4填空(2分)
根据指令编码,R型和I型指令可以通过opcode________(最高位/最低位)进行区分。
得分/总分
最高位
正确答案:最高位
5填空(2分)
R型指令的第二个操作数来自________(寄存器/立即数)。
得分/总分
寄存器
正确答案:寄存器
6填空(2分)
I型指令的第二个操作数来自________(寄存器/立即数)。
得分/总分
立即数
正确答案:立即数
7填空(2分)
加1指令(INC)在这个指令集中,可以使用________指令实现。
(ADD/SUB/AND/OR/XOR/ADDI/SUBI/ANDI/ORI/XORI)
得分/总分
ADDI
正确答案:ADDI
8填空(2分)
减1指令(DEC)在这个指令集中,可以使用________指令实现。
(ADD/SUB/AND/OR/XOR/ADDI/SUBI/ANDI/ORI/XORI)
得分/总分
SUBI
正确答案:SUBI
9填空(2分)
逻辑非(NOT)在这个指令集中,可以使用________指令实现。
(ADD/SUB/AND/OR/XOR/ADDI/SUBI/ANDI/ORI/XORI)
得分/总分
XORI
正确答案:XORI
10填空(2分)
传送(MOV)在这个指令集中,可以使用ADD指令和________(R0/R1/R2/R3)寄存器配合实现。
得分/总分
R0
正确答案:R0
实验代码
VirtualBoard.sv
`default_nettype none module VirtualBoard ( input logic CLOCK, // 10 MHz Input Clock input logic [19:0] PB, // 20 Push Buttons, logical 1 when pressed input logic [35:0] S, // 36 Switches output logic [35:0] L, // 36 LEDs, drive logical 1 to light up output logic [7:0] SD7, // 8 common anode Seven-segment Display output logic [7:0] SD6, output logic [7:0] SD5, output logic [7:0] SD4, output logic [7:0] SD3, output logic [7:0] SD2, output logic [7:0] SD1, output logic [7:0] SD0 ); /********* Seven-segment decoder instantiation **********/ logic [3:0] HD[7:0]; // 8 hexadecimal display SevenSegDecode ssdecode_inst7(.iData(HD[7]), .oSeg(SD7)); SevenSegDecode ssdecode_inst6(.iData(HD[6]), .oSeg(SD6)); SevenSegDecode ssdecode_inst5(.iData(HD[5]), .oSeg(SD5)); SevenSegDecode ssdecode_inst4(.iData(HD[4]), .oSeg(SD4)); SevenSegDecode ssdecode_inst3(.iData(HD[3]), .oSeg(SD3)); SevenSegDecode ssdecode_inst2(.iData(HD[2]), .oSeg(SD2)); SevenSegDecode ssdecode_inst1(.iData(HD[1]), .oSeg(SD1)); SevenSegDecode ssdecode_inst0(.iData(HD[0]), .oSeg(SD0)); /** The input port is replaced with an internal signal **/ wire reset = PB[0]; wire clk = PB[1]; wire [1:0] write_addr = S[13:12]; wire [1:0] read_addr1 = S[11:10]; wire [1:0] read_addr2 = S[9:8]; wire [3:0] imm_data = S[7:4]; wire [3:0] opcode = S[3:0]; //各模块间连线信号 wire [3:0] alu_result, alu_y, read_data1, read_data2; wire [3:0] flag; wire write_enable; wire immToALU; wire [3:0] ALUctrl; /************* The logic of this experiment *************/ /*- 在这里写出控制器的逻辑设计 -*/ assign write_enable=1; assign immToALU=opcode[3]; always_comb begin case(opcode[2:0]) 3'b001:ALUctrl=4'b0000; 3'b010:ALUctrl=4'b0100; 3'b011:ALUctrl=4'b0001; 3'b100:ALUctrl=4'b0010; 3'b101:ALUctrl=4'b0011; default:ALUctrl=4'bx; endcase end // 数据通路部分 assign alu_y = immToALU ? imm_data : read_data2; RegFile #(4) regfile(.Clk(clk),.iWE(write_enable),.iWA(write_addr), .iRA1(read_addr1),.iRA2(read_addr2),.iWD(alu_result),.oRD1(read_data1),.oRD2(read_data2)); sALU #(4) salu(.iX(read_data1),.iY(alu_y),.iCtrl(ALUctrl),.oF(alu_result),.oFlag(flag)); /*- 实例化单周期数据通路实验中的sALU模块和寄存器堆模块。 ALU ... RegFile ... -*/ /****** Internal signal assignment to output port *******/ assign HD[0] = alu_y; assign HD[1] = read_data1; assign HD[2] = read_data2; assign HD[3] = alu_result; assign L[21:18] = flag; assign L[5] = write_enable; assign L[4] = immToALU; assign L[3:0] = ALUctrl; endmodule
Regfile.sv
`default_nettype none module RegFile #(parameter N=4) ( input logic Clk, input logic iWE, input logic [1:0] iWA,iRA1,iRA2, input logic [N-1:0] iWD, output logic [N-1:0] oRD1,oRD2 ); /********* Seven-segment decoder instantiation **********/ // 2-4 decode logic load3, load2, load1, load0; always_comb begin if (iWE) case (iWA) 2'b00: {load3, load2, load1, load0} = 4'b0001; 2'b01: {load3, load2, load1, load0} = 4'b0010; 2'b10: {load3, load2, load1, load0} = 4'b0100; 2'b11: {load3, load2, load1, load0} = 4'b1000; default: {load3, load2, load1, load0} = 4'bx; endcase else {load3, load2, load1, load0} = 4'b0000; end // register instantiation logic [N-1:0] R0_Q, R1_Q, R2_Q, R3_Q; DataReg #(N) R0(.oQ(R0_Q), .iD(iWD), .Clk(Clk), .Load(load0), .Reset(1'b0)); DataReg #(N) R1(.oQ(R1_Q), .iD(iWD), .Clk(Clk), .Load(load1), .Reset(1'b0)); DataReg #(N) R2(.oQ(R2_Q), .iD(iWD), .Clk(Clk), .Load(load2), .Reset(1'b0)); DataReg #(N) R3(.oQ(R3_Q), .iD(iWD), .Clk(Clk), .Load(load3), .Reset(1'b0)); always_comb begin case (iRA1) 2'b00 : oRD1=R0_Q; 2'b01 : oRD1=R1_Q; 2'b10 : oRD1=R2_Q; 2'b11 : oRD1=R3_Q; default : oRD1=4'bx; endcase case (iRA2) 2'b00 : oRD2=R0_Q; 2'b01 : oRD2=R1_Q; 2'b10 : oRD2=R2_Q; 2'b11 : oRD2=R3_Q; default : oRD2=4'bx; endcase end endmodule
sALU.sv
`default_nettype none module sALU #(parameter N=4) ( input logic [N-1:0] iX,iY, input logic [2:0] iCtrl, output logic [N-1:0] oF, output logic [3:0] oFlag ); wire M0=iCtrl[2]; wire S1=iCtrl[1]; wire S0=iCtrl[0]; wire [N-1:0] A,F; wire C0=M0; assign A=iX; wire [N-1:0] B=iY^{N{M0}}; logic [N:0] result; always_comb begin case({S1,S0}) 2'b00:result=A+B+C0; 2'b01:result=iX&B; 2'b10:result=iX|B; 2'b11:result=iX^B; default:result={(N+1){1'bx}}; endcase end assign oF=result[N-1:0]; wire sign,zero,overflow,carryOut; assign sign=F[N-1]; assign zero=~(|F); assign overflow=~A[N-1]&~B[N-1]&F[N-1]|A[N-1]&B[N-1]&~F[N-1]; assign carryOut=result[N]; assign oFlag={sign,zero,overflow,carryOut}; endmodule