icicle/bus_arbiter.sv
2017-12-25 23:33:53 +00:00

63 lines
1.9 KiB
Systemverilog

`ifndef BUS_ARBITER
`define BUS_ARBITER
module bus_arbiter (
/* instruction memory bus */
input [31:0] instr_address_in,
input instr_read_in,
output logic [31:0] instr_read_value_out,
output logic instr_ready,
/* data memory bus */
input [31:0] data_address_in,
input data_read_in,
input data_write_in,
output logic [31:0] data_read_value_out,
input [3:0] data_write_mask_in,
input [31:0] data_write_value_in,
output logic data_ready,
/* common memory bus */
output logic [31:0] address_out,
output logic read_out,
output logic write_out,
input [31:0] read_value_in,
output logic [3:0] write_mask_out,
output logic [31:0] write_value_out
);
always_comb begin
if (data_read_in || data_write_in) begin
address_out = data_address_in;
read_out = data_read_in;
write_out = data_write_in;
instr_read_value_out = 32'bx;
data_read_value_out = read_value_in;
write_mask_out = data_write_mask_in;
write_value_out = data_write_value_in;
instr_ready = 1'b0;
data_ready = 1'b1;
end else if (instr_read_in) begin
address_out = instr_address_in;
read_out = instr_read_in;
write_out = 1'b0;
instr_read_value_out = read_value_in;
data_read_value_out = 32'bx;
write_mask_out = 4'b0;
write_value_out = 32'bx;
instr_ready = 1'b1;
data_ready = 1'b0;
end else begin
address_out = 32'bx;
read_out = 1'b0;
write_out = 1'b0;
instr_read_value_out = 32'bx;
data_read_value_out = 32'bx;
write_mask_out = 4'b0;
write_value_out = 32'bx;
instr_ready = 1'b0;
data_ready = 1'b0;
end
end
endmodule
`endif