1
0
mirror of https://github.com/aolofsson/oh.git synced 2025-01-30 02:32:53 +08:00
oh/emesh/hdl/emesh_if.v
2020-01-28 18:12:57 -05:00

100 lines
2.9 KiB
Verilog

//WARNING: Pass through logic
module emesh_if (/*AUTOARG*/
// Outputs
cmesh_wait_out, cmesh_access_out, cmesh_packet_out, rmesh_wait_out,
rmesh_access_out, rmesh_packet_out, xmesh_wait_out,
xmesh_access_out, xmesh_packet_out, emesh_wait_out,
emesh_access_out, emesh_packet_out,
// Inputs
cmesh_access_in, cmesh_packet_in, cmesh_wait_in, rmesh_access_in,
rmesh_packet_in, rmesh_wait_in, xmesh_access_in, xmesh_packet_in,
xmesh_wait_in, emesh_access_in, emesh_packet_in, emesh_wait_in
);
parameter AW = 32;
parameter PW = 2*AW+40;
//##Cmesh##
input cmesh_access_in;
input [PW-1:0] cmesh_packet_in;
output cmesh_wait_out;
output cmesh_access_out;
output [PW-1:0] cmesh_packet_out;
input cmesh_wait_in;
//##Rmesh##
input rmesh_access_in;
input [PW-1:0] rmesh_packet_in;
output rmesh_wait_out;
output rmesh_access_out;
output [PW-1:0] rmesh_packet_out;
input rmesh_wait_in;
//##Xmesh##
input xmesh_access_in;
input [PW-1:0] xmesh_packet_in;
output xmesh_wait_out;
output xmesh_access_out;
output [PW-1:0] xmesh_packet_out;
input xmesh_wait_in;
//##Emesh##
input emesh_access_in;
input [PW-1:0] emesh_packet_in;
output emesh_wait_out;
//core-->io
output emesh_access_out;
output [PW-1:0] emesh_packet_out;
input emesh_wait_in;
//#####################################################
//# EMESH-->(RMESH/XMESH/CMESH)
//#####################################################
assign cmesh_access_out = emesh_access_in & emesh_packet_in[0];
assign rmesh_access_out = emesh_access_in & ~emesh_packet_in[0];
//Don't drive on xmesh for now
assign xmesh_access_out = 1'b0;
//Distribute emesh to xmesh,cmesh, rmesh
assign cmesh_packet_out[PW-1:0] = emesh_packet_in[PW-1:0];
assign rmesh_packet_out[PW-1:0] = emesh_packet_in[PW-1:0];
assign xmesh_packet_out[PW-1:0] = emesh_packet_in[PW-1:0];
assign emesh_wait_out = cmesh_wait_in |
rmesh_wait_in |
xmesh_wait_in;
//#####################################################
//# (RMESH/XMESH/CMESH)-->EMESH
//#####################################################
assign emesh_access_out = cmesh_access_in |
rmesh_access_in |
xmesh_access_in;
//TODO: Make round robin?? (Fancify)
assign emesh_packet_out[PW-1:0] = cmesh_access_in ? cmesh_packet_in[PW-1:0] :
rmesh_access_in ? rmesh_packet_in[PW-1:0] :
xmesh_packet_in[PW-1:0];
assign cmesh_wait_out = (cmesh_access_in & emesh_wait_in);
assign rmesh_wait_out = rmesh_access_in &
(emesh_wait_in | cmesh_access_in);
assign xmesh_wait_out = xmesh_access_in &
(emesh_wait_in | cmesh_access_in | rmesh_access_in);
endmodule // emesh_if