Completed wrapper, to be tested

This commit is contained in:
Aadi Desai 2020-12-11 19:45:00 +00:00
parent 714b74ec83
commit af7645b5b0

View file

@ -22,6 +22,10 @@ logic clk_internal; // modulated clock to be passed to harvard cpu
logic[31:0] harvard_instr_address; // instr addr from pc logic[31:0] harvard_instr_address; // instr addr from pc
logic harvard_read; // harvard cpu read flag logic harvard_read; // harvard cpu read flag
logic harvard_write; // harvard cpu write flag logic harvard_write; // harvard cpu write flag
logic[31:0] harvard_data_address; // data addr from ALU
logic[31:0] harvard_readdata; // <= data read from Avalon MM Device
logic[3:0] write_byteenable; // byteenable calculator for partial write
logic clk_state; // make sure posedge and negedge of clk do not occur repeatedly
initial begin initial begin
clk_internal = 1'b0; clk_internal = 1'b0;
@ -33,37 +37,49 @@ initial begin
read = 1'b0; read = 1'b0;
writedata = 32'h00000000; writedata = 32'h00000000;
byteenable = 4'b0000; byteenable = 4'b0000;
clk_state = 0;
end end
always_ff @(posedge clk) begin // CLK Rising Edge always_ff @(posedge clk) begin // CLK Rising Edge
if (waitrequest) begin if (!waitrequest && !clk_state) begin
end else begin
case (n_state) case (n_state)
2'b00: begin // fetch 2'b00: begin // fetch
clk_internal <= 1'b1; clk_internal <= 1'b1;
state <= 2'b00; state <= 2'b00;
end end
2'b01: begin // execute 2'b01: begin // execute
state <= 2'b10; state <= 2'b01;
instr_reg <= readdata; instr_reg <= readdata;
end end
2'b10: begin // read 2'b10: begin // read
state <= 2'b10;
end end
2'b11: begin // write 2'b11: begin // write
state <= 2'b11;
end end
endcase // state endcase // state
end end
clk_state <= 1'b1;
end end
always_ff @(negedge clk) begin // CLK Falling Edge always_ff @(negedge clk) begin // CLK Falling Edge
case (state) if (!waitrequest && clk_state) begin
2'b00: // nothing happens on fetch negedge case (state)
2'b01: begin // execute negedge 2'b00: // nothing happens on fetch negedge
if (!harvard_read && !harvard_write) begin // instruction complete, trigger writeback 2'b01: begin // execute negedge
if (!harvard_read && !harvard_write) begin // instruction complete, trigger writeback
clk_internal <= 1'b0;
end // otherwise do nothing
end
2'b10: begin
clk_internal <= 1'b0; clk_internal <= 1'b0;
end // otherwise do nothing end
end 2'b11: begin
endcase clk_internal <= 1'b0;
end
endcase
end
clk_state <= 1'b0;
end end
always_comb begin always_comb begin
@ -79,24 +95,48 @@ always_comb begin
byteenable = 4'b0000; byteenable = 4'b0000;
end else begin end else begin
case (state) case (state)
2'b00: begin 2'b00: begin // connecting wires when in fetch state
address = harvard_instr_address; address = harvard_instr_address;
read = 1'b1; read = 1'b1;
write = 1'b0;
byteenable = 4'b1111; byteenable = 4'b1111;
harvard_readdata = 32'h00000000;
writedata = 32'h00000000;
n_state = 2'b01; n_state = 2'b01;
end end
2'b01: begin 2'b01: begin // connecting wires when in execute state
address = 32'h00000000; address = 32'h00000000;
read = 1'b0; read = 1'b0;
write = 1'b0;
byteenable = 4'b0000; byteenable = 4'b0000;
harvard_readdata = 32'h00000000;
writedata = 32'h00000000;
if (harvard_read) begin if (harvard_read) begin
n_state = 2'b10; // next state is read n_state = 2'b10; // next state is read
end else if (harvard_write) begin end else if (harvard_write) begin
n_state = 2'b11; // next state is write n_state = 2'b11; // next state is write
end else begin end else begin
n_state 2'b00; // next state is fetch n_state = 2'b00; // next state is fetch
end end
end end
2'b10: begin // connecting wires when in read state
address = harvard_data_address;
read = 1'b1;
write = 1'b0;
byteenable = 4'b1111;
harvard_readdata = readdata;
writedata = 32'h00000000;
n_state = 2'b00;
end
2'b11: begin // connecting wires when in write state
address = harvard_data_address;
read = 1'b0;
write = 1'b1;
byteenable = write_byteenable;
harvard_readdata = 32'h00000000;
writedata = harvard_writedata;
n_state = 2'b00;
end
endcase // state endcase // state
end end
end end
@ -109,11 +149,11 @@ mips_cpu_harvard mips_cpu_harvard( // Harvard CPU within wrapper
.clk_enable(1'b0), // unused clock enable, input .clk_enable(1'b0), // unused clock enable, input
.instr_address(harvard_instr_address), // instr addr from pc, output .instr_address(harvard_instr_address), // instr addr from pc, output
.instr_readdata(instr_reg), // cached instruction passed into harvard cpu, input .instr_readdata(instr_reg), // cached instruction passed into harvard cpu, input
.data_address(######), // output .data_address(harvard_data_address), // harvard data memory address, output
.data_write(harvard_write), // harvard write flag, output .data_write(harvard_write), // harvard write flag, output
.data_read(harvard_read), // harvard read flag, output .data_read(harvard_read), // harvard read flag, output
.data_writedata(######), // output .data_writedata(harvard_writedata), // data output from regfile readport2, output
.data_readdata(######) // input .data_readdata(harvard_readdata) // data in from read instruction, input
); );
endmodule : mips_cpu_bus endmodule : mips_cpu_bus