mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-12-28 05:51:53 +01:00
75 lines
1.9 KiB
Systemverilog
75 lines
1.9 KiB
Systemverilog
interface if_n64_bus ();
|
|
|
|
localparam sc64::e_n64_id NUM_DEVICES = sc64::__ID_N64_END;
|
|
|
|
sc64::e_n64_id id;
|
|
logic request;
|
|
logic ack;
|
|
logic write;
|
|
logic [31:0] address;
|
|
logic [15:0] wdata;
|
|
logic [15:0] rdata;
|
|
logic n64_active;
|
|
logic [31:0] real_address;
|
|
logic read_op;
|
|
logic write_op;
|
|
|
|
logic device_ack [(NUM_DEVICES - 1):0];
|
|
logic [15:0] device_rdata [(NUM_DEVICES - 1):0];
|
|
|
|
always_comb begin
|
|
ack = 1'b0;
|
|
rdata = 16'd0;
|
|
|
|
for (integer i = 0; i < NUM_DEVICES; i++) begin
|
|
ack = ack | device_ack[i];
|
|
rdata = rdata | device_rdata[i];
|
|
end
|
|
|
|
if (id >= NUM_DEVICES) begin
|
|
ack = request;
|
|
end
|
|
end
|
|
|
|
modport n64 (
|
|
output id,
|
|
output request,
|
|
input ack,
|
|
output write,
|
|
output address,
|
|
output wdata,
|
|
input rdata,
|
|
output n64_active,
|
|
output real_address,
|
|
output read_op,
|
|
output write_op
|
|
);
|
|
|
|
genvar n;
|
|
generate
|
|
for (n = 0; n < NUM_DEVICES; n++) begin : at
|
|
logic device_request;
|
|
logic device_n64_active;
|
|
|
|
always_comb begin
|
|
device_request = request && id == sc64::e_n64_id'(n);
|
|
device_n64_active = n64_active && id == sc64::e_n64_id'(n);
|
|
end
|
|
|
|
modport device (
|
|
input .request(device_request),
|
|
output .ack(device_ack[n]),
|
|
input .write(write),
|
|
input .address(address),
|
|
input .wdata(wdata),
|
|
output .rdata(device_rdata[n]),
|
|
input .n64_active(device_n64_active),
|
|
input .real_address(real_address),
|
|
input .read_op(read_op),
|
|
input .write_op(write_op)
|
|
);
|
|
end
|
|
endgenerate
|
|
|
|
endinterface
|