# Simple B Team 23
pc.v
module pc(input clock,reset,branchFlag,ce,//changeEnable
input [15:0] dr,
output reg [15:0] pc,pcPlusOne);
reg [15:0] p2_master,p2_slave,p3_master,p3_slave,p4_master,p4_slave,p5;
reg pcStoped;
always @(*)begin
pcPlusOne <= pc + 1;
end
always @(posedge clock) begin
if(reset == 1'b 1)begin
pc <= 0;
end else begin
if(ce == 1'b1)begin
if(branchFlag == 1'b 1) begin
pc <= dr;
end else begin
pc <= pc+1;
end
end
end
end
endmodule
register.v
module register(
input [15:0] WriteData,
input clk,rst_n,
output reg [15:0] DataOut);
reg [15:0] RegData;
always @ (posedge clk) begin
if(!rst_n) begin
RegData <= 16'b0000000000000000;
end else begin
DataOut <= RegData;
RegData <= WriteData;
end
end
endmodule
RegisterFile.v
module RegisterFile(
input [2:0] Read1,Read2,WriteReg,
input [15:0] WriteData,
input clk,RegWrite,
output [15:0] Data1,Data2);
reg [15:0] RegFile [7:0];
assign Data1 = RegFile [Read1];
assign Data2 = RegFile [Read2];
always @ (posedge clk) begin
if(!RegWrite) begin
RegFile [WriteReg] <= WriteData;
end
end
endmodule
ctl.v
module ctl(
input clk,rst_n,
input [15:0] inst,
output reg MemRead,MemWrite,RegRead,RegWrite,ALUSrc,MemtoReg,
output reg [3:0] ALUop,Shiftop,
output reg [2:0] RegDst,
output reg [2:0] Branch);
wire [1:0] twobit;
wire opcode;
reg [15:0] inst_reg;
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
inst_reg <= 16'b0000000000000000;
end else begin
inst_reg <= inst;
twobit <= inst[15:14];
opcode <= inst[7];
if(twwobit == 2'b11 ) begin
if(opcode == 1'b0) begin
MemRead <= 1'b0;
MemWrite <= 1'b0;
RegRead <= 1'b1;
RegWrite <= 1'b1;
ALUSrc <= 1'b0;
MemotoReg <= 1'b0;
ALUop <= inst[7:4];
Shiftop <= 4'b0000;
end else begin
MemRead <= 1'b0;
MemWrite <= 1'b0;
RegRead <= 1'b1;
RegWrite <= 1'b1;
ALUSrc <= 1'b0;
MemotoReg <= 1'b0;
Shiftop <= inst[7:4];
ALUop <= 4'b1000;
end
end else if(twobit == 2'b00) begin
MemRead <= 1'b0;
MemWrite <= 1'b0;
RegRead <= 1'b1;
RegWrite <= 1'b1;
ALUSrc <= 1'b0;
MemotoReg <= 1'b0;
要求仕様:mifファイルに書かれた内容をメモリに書き込み、命令を読み出して命令を順次実行する。メモリへの読み出し書き込みをする。
入出力を可能にする。
設計目標;SIMPLE/Bを設計し、パイプライン化、不成立分岐予測、ハーバードアーキテクチャ、高速なソートを可能にする。
設計方針:各コンポーネントをまず設計し、それらを組み合わせて全体を設計する。
性能の目標数値:?
高速化:五段パイプライン、動作周波数は20MHzを目標(一旦)
方式設計仕様書:
概要:ボトムアップ、
命令セットアーキテクチャ:資料+addi
構造と動作:
訂正版のreister (5/11)
module register(
input [15:0] WriteData,
input clk,rst_n,ce,
output reg [15:0] DataOut);
always @ (posedge clk) begin
if(!rst_n) begin
DataOut <= 16'b0000000000000000;
end else begin
if (ce==1'b1)
DataOut <= WriteData;
else
DataOut <= DataOut;
end
end
endmodule
include "ALU.v"
`include "RegisterFile.v"
`include "register.v"
`include "register2.v"
`include "shifter.v"
`include "PC.v"
`include "phasecounter.v"
`include "phase3ctl.v"
`include "phase4ctl.v"
`include "phase5ctl.v"
`include "ctl.v"
`include "branch.v"
`include "RemoveChattering.v"
`include "counta2.v"
`include "counta3.v"
`include "segLED.v"
`include "divider.v"
`include "display.v"
`include "forwardingunit.v"
module simple_pipeline(
input [15:0] in,//input
input clkin,
input clk20,
input rst_n,
input exec,
output [7:0] out2,
output [3:0] sel2,
output [7:0] out3,
output [3:0] sel3,
output ce1out,
output ce2out,
output ceout,
output [7:0] disp_1,disp_2,disp_3,disp_4,disp_5,disp_6,disp_7,disp_8,
output [8:0] sl_out2
);
reg [31:0] count;
wire [0:0] clk;
wire [3:0] clkout;
wire [15:0] IROut,BROut,AROut,AR2In,AR2Out,SZCVIn,SZCVOut,DRIn,DROut,MDRIn,MDROut,MDR2Out,out;
wire [2:0] Rs,Rd;
wire [3:0] dshift,dshiftout;
wire [7:0] d;
wire [15:0] exdin,exdout;
wire [15:0] WriteData;
wire MemRead,MemWrite,RegWrite,ALUSrc1,ALUSrc2,MemtoReg,Output,Input,ALUorshifter,ce_1,ce_2,ce1,ce2,brch_sig;
wire [15:0] A_wire,B_wire,Data1,Data2,ALUOut,shifterIn,shifterOut;
wire [3:0] ALUcondout,shiftercondout;
wire [15:0] Inst,Inst_wire1,Inst_wire2;
wire [15:0] pc,pcPlusOne,PC1Out,PC2Out,PCIn;
wire [2:0] Branch;
wire [15:0] reg_0,reg_1,reg_2,reg_3,reg_4,reg_5,reg_6,reg_7,reg_8,reg_9,reg_10,reg_11,reg_12,reg_13,reg_14,reg_15;
wire [15:0] address;
wire [2:0] RegDst_wire;
wire [3:0] opcode_wire,opcode_wire1,opcode_wire2;
wire brch_sig_wire;
wire [7:0] ctlcheck;
wire [15:0] SZCV10;
wire [15:0] MemData,MemWriteData;
wire x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16;
wire [3:0] y0;
wire [2:0] z0,z1,z2,z3,z4,z5,z6,z7,z8;
wire MemReadout,MemWriteout,RegWriteout,ALUSrc1out,ALUSrc2out,MemtoRegout,Outputout,Inputout,ALUorshifterout,AS_BCout,SLIout;
wire [3:0] opcodeout;
wire [2:0] RegDstout,Branchout;
wire hazard;
wire [1:0] ForwardA,ForwardB;
register IR(.clk(clk),.rst_n(rst_n),.WriteData(Inst_wire1&{16{hazard}}),.DataOut(IROut));
register PC1(.clk(clk),.rst_n(rst_n),.WriteData(pcPlusOne),.DataOut(PC1Out));
register BR(.clk(clk),.rst_n(rst_n),.WriteData(Data2),.DataOut(BROut));
register AR(.clk(clk),.rst_n(rst_n),.WriteData(Data1),.DataOut(AROut));
register PC2(.clk(clk),.rst_n(rst_n),.WriteData(PC1Out),.DataOut(PC2Out));
register AR2(.clk(clk),.rst_n(rst_n),.WriteData(AR2In),.DataOut(AR2Out));
register CR(.clk(clk),.rst_n(rst_n),.WriteData(exdin),.DataOut(exdout));
register2 CR2(.clk(clk),.rst_n(rst_n),.WriteData(dshift),.DataOut(dshiftout));
register SZCV(.clk(clk),.rst_n(rst_n),.WriteData(SZCVIn),.DataOut(SZCVOut));
register DR(.clk(clk),.rst_n(rst_n),.WriteData(DRIn),.DataOut(DROut));
register MDR(.clk(clk),.rst_n(rst_n),.WriteData(MDRIn),.DataOut(MDROut));
register MDR2(.clk(clk),.rst_n(rst_n),.WriteData(DROut),.DataOut(MDR2Out));
RegisterFile RF(.Read1(Rs),.Read2(Rd),.WriteReg(RegDstout),.WriteData(WriteData),.clk(~clk),.rst_n(rst_n),.RegWrite(RegWriteout),.Data1(Data1),.Data2(Data2),
.reg_1(reg_1),.reg_2(reg_2),.reg_3(reg_3),.reg_4(reg_4),.reg_5(reg_5),.reg_6(reg_6),.reg_7(reg_7),.reg_0(reg_0));
ALU ALU(.ALUctl(opcodeout),.A(A_wire),.B(B_wire),.Out(ALUOut),.Outcond(ALUcondout));
ctl ctl(.inst(Inst_wire2),.MemRead(MemRead),.MemWrite(MemWrite),.RegWrite(RegWrite),.ALUSrc1(ALUSrc1),.ALUSrc2(ALUSrc2),.MemtoReg(MemtoReg),.ALUorShifter(ALUorshifter),.Halt(ce1),
.Output(Output),.Input(Input),.opcode(opcode_wire),.RegDst(RegDst_wire),.Branch(Branch),.AS_BC(AS_BC),.SLI(SLI));
finding_hazard fh(.ID_EX_MemRead(x14),.ID_EX_Input(x5),.ID_EX_RegisterRa(z2),.IF_ID_RegisterRa(Inst_wire1[13:11]),.IF_ID_RegisterRb(Inst_wire1[10:8]),.hazard_ctl(hazard));
forwardingunit fd(.EX_MEM_RegWrite(x13),.MEM_WB_RegWrite(RegWriteout),.EX_MEM_RegDst(z4),.MEM_WB_RegDst(RegDstout),.ID_EX_RegisterRa(z7),.ID_EX_RegisterRb(z8),.ForwardA(ForwardA),.ForwardB(ForwardB));
shifter sf(.A(shifterIn),.opcode(opcodeout),.d(dshiftout),.Out(shifterOut),.Outcond(shiftercondout));
PC PC(.clock(clk),.reset(rst_n),.branchFlag(brch_sig_wire),.ce(ce_1),.dr(DROut),.pc(pc),.pcPlusOne(pcPlusOne));
phase3ctl p3IFID(.ALUSrc1in(ALUSrc1&hazard),.ALUSrc2in(ALUSrc2&hazard),.ALUorshifterin(ALUorshifter&hazard),.AS_BCin(AS_BC&hazard&(~brch_sig_wire)),.MemReadin(MemRead&hazard),.SLIin(SLI),.Rain(Inst_wire1[13:11]&{3{hazard}}),.Rbin(Inst_wire1[10:8]&{3{hazard}}),.opcodein(opcode_wire&{4{hazard}}),
.clk(clk),.rst_n(rst_n),.ALUSrc1out(x0),.ALUSrc2out(x1),.ALUorshifterout(x2),.AS_BCout(x3),.MemReadout(x14),.SLIout(x16),.Raout(z5),.Rbout(z6),.opcodeout(y0));
phase4ctl p4IFID(.MemWritein(MemWrite&hazard&(~brch_sig_wire)), .Inputin(Input&hazard),.Branchin(Branch),.clk(clk),.rst_n(rst_n),.MemWriteout(x4), .Inputout(x5),.Branchout(z0));
phase5ctl p5IFID(.MemtoRegin(MemtoReg&hazard),.RegWritein(RegWrite&hazard&(~brch_sig_wire)),.RegDstin(RegDst_wire&{3{hazard}}),.clk(clk),.rst_n(rst_n),.MemtoRegout(x8),.RegWriteout(x9),.RegDstout(z2));
phase3ctl p3IDEX(.ALUSrc1in(x0),.ALUSrc2in(x1),.ALUorshifterin(x2),.AS_BCin(x3&(~brch_sig_wire)),.MemReadin(x14),.SLIin(x16),.Rain(z5),.Rbin(z6),.opcodein(y0),
.clk(clk),.rst_n(rst_n),.ALUSrc1out(ALUSrc1out),.ALUSrc2out(ALUSrc2out),.ALUorshifterout(ALUorshifterout),.AS_BCout(AS_BCout),.MemReadout(x15),.SLIout(SLIout),.Raout(z7),.Rbout(z8),.opcodeout(opcodeout));
phase4ctl p4IDEX(.MemWritein(x4&(~brch_sig_wire)), .Inputin(x5),.Branchin(z0),.clk(clk),.rst_n(rst_n),.MemWriteout(x6), .Inputout(x7),.Branchout(z1));
phase5ctl p5IDEX(.MemtoRegin(x8),.RegWritein(x9&(~brch_sig_wire)),.RegDstin(z2),.clk(clk),.rst_n(rst_n),.MemtoRegout(x10),.RegWriteout(x11),.RegDstout(z3));
phase4ctl p4EXMEM(.MemWritein(x6&(~brch_sig_wire)), .Inputin(x7),.Branchin(z1),.clk(clk),.rst_n(rst_n),.MemWriteout(MemWriteout), .Inputout(Inputout),.Branchout(Branchout));
phase5ctl p5EXMEM(.MemtoRegin(x10),.RegWritein(x11&(~brch_sig_wire)),.RegDstin(z3),.clk(clk),.rst_n(rst_n),.MemtoRegout(x12),.RegWriteout(x13),.RegDstout(z4));
phase5ctl p5MEMWB(.MemtoRegin(x12),.RegWritein(x13),.RegDstin(z4),.clk(clk),.rst_n(rst_n),.MemtoRegout(MemtoRegout),.RegWriteout(RegWriteout),.RegDstout(RegDstout));
branch br(.cond(SZCVOut),.brch(Branchout),.brch_sig(brch_sig_wire));
ram ram1(.address(pc),.clock(~clk),.data(0),.wren(1'b0),.q(Inst));
ram ram2(.address(DROut),.clock(~clk),.data(AR2Out),.wren(MemWriteout),.q(MemData));
pll pll(.areset(0),.inclk0(clkin),.c0(clkout));
RemoveChattering rc(.clk(clk20),.botton(exec),.rst_n(rst_n),.signal(ce2));
counta2 c2(.rst_n(rst_n), .clk(clk20),.data(pc),.out2(out2),.sel2(sel2));
counta3 c3(.rst_n(rst_n), .clk(clk20),.data(Inst),.out2(out3),.sel2(sel3));
display ds(.sl_clk(clk20),.rst(rst_n),
.reg_0(reg_0),.reg_1(reg_1),.reg_2(reg_2),.reg_3(reg_3),.reg_4(reg_4),.reg_5(reg_5),.reg_6(reg_6),.reg_7(reg_7),
.reg_8(reg_8),.reg_9(reg_9),.reg_10(reg_10),.reg_11(reg_11),.reg_12(reg_12),.reg_13(reg_13),.reg_14(reg_14),.reg_15(reg_15),
.ctl(ctlcheck),
.disp_1(disp_1),.disp_2(disp_2),.disp_3(disp_3),.disp_4(disp_4),.disp_5(disp_5),.disp_6(disp_6),.disp_7(disp_7),.disp_8(disp_8),.sl_out(sl_out2));
assign Rs = IROut[13:11];
assign Rd = IROut[10:8];
assign dshift = IROut[3:0];
assign d = IROut[7:0];
assign A_wire = (ALUSrc1out==1'b1) ? PC2Out:
(ForwardB==2'b01 && ALUSrc1out==1'b0) ? DROut:
(ForwardB==2'b10 && ALUSrc1out==1'b0) ? WriteData:
BROut;
assign shifterIn = (ALUSrc1out==1'b1) ? PC2Out:
(SLIout==1'b1) ? {{12{d[7]}},d[7:4]}:
(ForwardB==2'b01 && ALUSrc1out==1'b0) ? DROut:
(ForwardB==2'b10 && ALUSrc1out==1'b0) ? WriteData:
BROut;
assign B_wire = (ALUSrc2out==1'b1) ? exdout:
(ForwardA==2'b01 && ALUSrc2out==1'b0) ? DROut:
(ForwardA==2'b10 && ALUSrc2out==1'b0) ? WriteData:
AROut;
assign AR2In = (ForwardA==2'b01) ? DROut:
(ForwardA==2'b10) ? WriteData:
AROut;
assign out = (ForwardA==2'b01 && ALUSrc2out==1'b0) ? DROut:
(ForwardA==2'b10 && ALUSrc2out==1'b0) ? WriteData:
AROut;
assign DRIn = (ALUorshifterout==1'b0) ? ALUOut:
shifterOut;
assign SZCVIn = (ALUorshifterout==1'b0 && AS_BCout==1'b1) ? ALUcondout:
(ALUorshifterout==1'b1 && AS_BCout==1'b1) ? shiftercondout:
SZCVOut;
assign MDRIn = (Inputout==1'b1) ? in:
MemData;
assign WriteData = (MemtoRegout==1'b1) ? MDROut:
MDR2Out;
// assign address = (hazard==1'b0) ? pc - 1:
// pc;
assign exdin = {{8{d[7]}},d};
assign opcode_wire1 = opcode_wire;
assign opcode_wire2 = opcode_wire;
assign Inst_wire1 = Inst;
assign Inst_wire2 = Inst;
assign PCIn = WriteData;
assign ce_1 = !ce1 && ce2 && hazard;
assign ce_2 = !ce1 && ce2;
assign clk = clkout && !ce1 && ce2;
//デバッグ用アサイン
assign ctlcheck = {hazard,MemtoRegout,brch_sig_wire,RegWriteout,MemWriteout,MemReadout,ALUSrc2out,ALUSrc1out};
assign SZCV10[15:12] = (SZCVOut / 6) % 2;
assign SZCV10[11:8] = (SZCVOut / 4) % 2;
assign SZCV10[7:4] = (SZCVOut / 2) % 2;
assign SZCV10[3:0] = SZCVOut % 2;
assign pcout = pc;
assign ceout = ce_1;
assign ce1out = ce1;
assign ce2out = ce2;
assign reg_8 = out;
assign reg_9 = DROut;
assign reg_10 = MDR2Out;
assign reg_11 = MDROut;
assign reg_12 = shifterOut;
assign reg_13 = ALUOut;
assign reg_14 = count[31:16];
assign reg_15 = count[15:0];
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
count <= 32'b00000000000000000000000000000000;
end else begin
if (ce_1 == 1'b1) begin
count <= count + 1;
end else begin
count <= count;
end
end
end
endmodule