Line 1... |
Line 1... |
`timescale 1ns/1ps
|
`include "pronoc_def.v"
|
|
|
/****************************
|
/****************************
|
* This module can inject and eject packets from the NoC.
|
* This module can inject and eject packets from the NoC.
|
* It can be used in simulation for injecting real application traces to the NoC
|
* It can be used in simulation for injecting real application traces to the NoC
|
* *************************/
|
* *************************/
|
|
|
|
|
module multicast_injector
|
module multicast_injector #(
|
import pronoc_pkg::*;
|
parameter NOC_ID=0
|
(
|
)(
|
//general
|
//general
|
current_e_addr,
|
current_e_addr,
|
reset,
|
reset,
|
clk,
|
clk,
|
//noc port
|
//noc port
|
Line 18... |
Line 19... |
//control interafce
|
//control interafce
|
pck_injct_in,
|
pck_injct_in,
|
pck_injct_out
|
pck_injct_out
|
);
|
);
|
|
|
|
`NOC_CONF
|
|
|
//general
|
//general
|
input reset,clk;
|
input reset,clk;
|
input [EAw-1 :0 ] current_e_addr;
|
input [EAw-1 :0 ] current_e_addr;
|
|
|
// the destination endpoint address
|
// the destination endpoint address
|
Line 37... |
Line 40... |
wire [RAw-1 :0 ] current_r_addr;
|
wire [RAw-1 :0 ] current_r_addr;
|
|
|
wire [DSTPw-1 : 0 ] destport;
|
wire [DSTPw-1 : 0 ] destport;
|
reg flit_wr;
|
reg flit_wr;
|
|
|
|
|
|
|
|
|
|
|
|
|
assign current_r_addr = chan_in.ctrl_chanel.neighbors_r_addr;
|
assign current_r_addr = chan_in.ctrl_chanel.neighbors_r_addr;
|
|
|
|
|
|
|
/*
|
/*
|
conventional_routing #(
|
conventional_routing #(
|
|
.NOC_ID(NOC_ID),
|
.TOPOLOGY(TOPOLOGY),
|
.TOPOLOGY(TOPOLOGY),
|
.ROUTE_NAME(ROUTE_NAME),
|
.ROUTE_NAME(ROUTE_NAME),
|
.ROUTE_TYPE(ROUTE_TYPE),
|
.ROUTE_TYPE(ROUTE_TYPE),
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
Line 73... |
Line 70... |
|
|
*/
|
*/
|
|
|
assign destport = 7;
|
assign destport = 7;
|
|
|
|
|
localparam
|
localparam
|
HDR_BYTE_NUM = HDR_MAX_DATw / 8, // = HDR_MAX_DATw / (8 - HDR_MAX_DATw %8)
|
HDR_BYTE_NUM = HDR_MAX_DATw / 8, // = HDR_MAX_DATw / (8 - HDR_MAX_DATw %8)
|
HDR_DATA_w_tmp = HDR_BYTE_NUM * 8,
|
HDR_DATA_w_tmp = HDR_BYTE_NUM * 8,
|
HDR_DATA_w = (PCK_INJ_Dw < HDR_DATA_w_tmp)? PCK_INJ_Dw : HDR_DATA_w_tmp;
|
HDR_DATA_w = (PCK_INJ_Dw < HDR_DATA_w_tmp)? PCK_INJ_Dw : HDR_DATA_w_tmp;
|
|
|
wire [HDR_DATA_w-1 : 0] hdr_data_in = pck_injct_in.data [HDR_DATA_w-1 : 0];
|
wire [HDR_DATA_w-1 : 0] hdr_data_in = pck_injct_in.data [HDR_DATA_w-1 : 0];
|
wire [Fw-1 : 0] hdr_flit_out;
|
wire [Fw-1 : 0] hdr_flit_out;
|
|
|
header_flit_generator #(
|
header_flit_generator #(
|
|
.NOC_ID(NOC_ID),
|
.DATA_w(HDR_DATA_w)
|
.DATA_w(HDR_DATA_w)
|
)
|
) the_header_flit_generator (
|
the_header_flit_generator
|
|
(
|
|
.flit_out (hdr_flit_out),
|
.flit_out (hdr_flit_out),
|
.vc_num_in (pck_injct_in.vc),
|
.vc_num_in (pck_injct_in.vc),
|
.class_in (pck_injct_in.class_num),
|
.class_in (pck_injct_in.class_num),
|
.dest_e_addr_in (pck_injct_in.endp_addr),
|
.dest_e_addr_in (pck_injct_in.endp_addr),
|
.src_e_addr_in (current_e_addr),
|
.src_e_addr_in (current_e_addr),
|
Line 198... |
Line 193... |
end
|
end
|
end
|
end
|
reg [V-1 : 0] credit_o;
|
reg [V-1 : 0] credit_o;
|
|
|
always @ (posedge clk) begin
|
always @ (posedge clk) begin
|
if(reset) begin
|
if(`pronoc_reset) begin
|
flit_type<=HEADER;
|
flit_type<=HEADER;
|
counter<=0;
|
counter<=0;
|
counter2<=0;
|
counter2<=0;
|
credit_o<={V{1'b0}};
|
credit_o<={V{1'b0}};
|
end else begin
|
end else begin
|
Line 216... |
Line 211... |
|
|
|
|
|
|
|
|
|
|
injector_ovc_status #(
|
multi_cast_injector_ovc_status #(
|
.V(V),
|
.V(V),
|
.B(LB),
|
.B(LB),
|
.CRDTw(CRDTw)
|
.CRDTw(CRDTw)
|
)
|
)
|
the_ovc_status
|
the_ovc_status
|
Line 234... |
Line 229... |
.clk(clk),
|
.clk(clk),
|
.reset(reset)
|
.reset(reset)
|
);
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wire [HDR_DATA_w-1 : 0] hdr_data_o;
|
wire [HDR_DATA_w-1 : 0] hdr_data_o;
|
hdr_flit_t hdr_flit_i;
|
hdr_flit_t hdr_flit_i;
|
|
|
header_flit_info
|
header_flit_info
|
#(
|
#(
|
|
.NOC_ID (NOC_ID),
|
.DATA_w (HDR_DATA_w )
|
.DATA_w (HDR_DATA_w )
|
) extractor (
|
) extractor (
|
.flit(chan_in.flit_chanel.flit),
|
.flit(chan_in.flit_chanel.flit),
|
.hdr_flit(hdr_flit_i),
|
.hdr_flit(hdr_flit_i),
|
.data_o(hdr_data_o)
|
.data_o(hdr_data_o)
|
Line 283... |
Line 274... |
end//always
|
end//always
|
|
|
|
|
|
|
|
|
always_ff @(posedge clk or posedge reset) begin
|
always_ff @(`pronoc_clk_reset_edge) begin
|
if (reset) begin
|
if (`pronoc_reset) begin
|
rsv_counter[i]<= {PCK_SIZw{1'b0}};
|
rsv_counter[i]<= {PCK_SIZw{1'b0}};
|
h2t_counter[i]<= 16'd0;
|
h2t_counter[i]<= 16'd0;
|
sender_endp_addr_reg [i]<= {EAw{1'b0}};
|
sender_endp_addr_reg [i]<= {EAw{1'b0}};
|
end else begin
|
end else begin
|
h2t_counter[i]<=h2t_counter_next[i];
|
h2t_counter[i]<=h2t_counter_next[i];
|
Line 311... |
Line 302... |
|
|
|
|
|
|
for (k=0;k< REMAIN_DAT_FLIT+1;k++)begin : K_
|
for (k=0;k< REMAIN_DAT_FLIT+1;k++)begin : K_
|
|
|
always_ff @(posedge clk or posedge reset) begin
|
always_ff @(`pronoc_clk_reset_edge) begin
|
if (reset) begin
|
if (`pronoc_reset) begin
|
pck_data_o_gen [i][k] <= {Fpay{1'b0}};
|
pck_data_o_gen [i][k] <= {Fpay{1'b0}};
|
|
|
end else begin
|
end else begin
|
if(chan_in.flit_chanel.flit.vc[i] & chan_in.flit_chanel.flit_wr ) begin
|
if(chan_in.flit_chanel.flit.vc[i] & chan_in.flit_chanel.flit_wr ) begin
|
if (chan_in.flit_chanel.flit.hdr_flag )begin
|
if (chan_in.flit_chanel.flit.hdr_flag )begin
|
Line 460... |
Line 451... |
|
|
/******************
|
/******************
|
* ovc_status
|
* ovc_status
|
*******************/
|
*******************/
|
|
|
module injector_ovc_status #(
|
module multi_cast_injector_ovc_status #(
|
parameter V = 4,
|
parameter V = 4,
|
parameter B = 16,
|
parameter B = 16,
|
parameter CRDTw =4
|
parameter CRDTw =4
|
)
|
)
|
(
|
(
|
Line 498... |
Line 489... |
|
|
|
|
genvar i;
|
genvar i;
|
generate
|
generate
|
for(i=0;i
|
for(i=0;i
|
`ifdef SYNC_RESET_MODE
|
always @ (`pronoc_clk_reset_edge)begin
|
always @ (posedge clk )begin
|
if(`pronoc_reset)begin
|
`else
|
|
always @ (posedge clk or posedge reset)begin
|
|
`endif
|
|
if(reset)begin
|
|
credit[i]<= credit_init_val_in[i][DEPTH_WIDTH-1:0];
|
credit[i]<= credit_init_val_in[i][DEPTH_WIDTH-1:0];
|
end else begin
|
end else begin
|
if( wr_in[i] && ~credit_in[i]) credit[i] <= credit[i]-1'b1;
|
if( wr_in[i] && ~credit_in[i]) credit[i] <= credit[i]-1'b1;
|
if( ~wr_in[i] && credit_in[i]) credit[i] <= credit[i]+1'b1;
|
if( ~wr_in[i] && credit_in[i]) credit[i] <= credit[i]+1'b1;
|
end //reset
|
end //reset
|
Line 517... |
Line 504... |
assign nearly_full_vc[i]= (credit[i] == 1) | full_vc[i];
|
assign nearly_full_vc[i]= (credit[i] == 1) | full_vc[i];
|
assign empty_vc[i] = (credit[i] == credit_init_val_in[i][DEPTH_WIDTH-1:0]);
|
assign empty_vc[i] = (credit[i] == credit_init_val_in[i][DEPTH_WIDTH-1:0]);
|
end//for
|
end//for
|
endgenerate
|
endgenerate
|
endmodule
|
endmodule
|
|
|
|
|
|
|
|
|
/**************************************
|
|
*
|
|
*
|
|
* ***********************************/
|
|
|
|
|
|
|
|
module packet_injector_verilator
|
|
import pronoc_pkg::*;
|
|
(
|
|
//general
|
|
current_e_addr,
|
|
reset,
|
|
clk,
|
|
//noc port
|
|
chan_in,
|
|
chan_out,
|
|
//control interafce
|
|
pck_injct_in_data,
|
|
pck_injct_in_size,
|
|
pck_injct_in_endp_addr,
|
|
pck_injct_in_class_num,
|
|
pck_injct_in_init_weight,
|
|
pck_injct_in_vc,
|
|
pck_injct_in_pck_wr,
|
|
pck_injct_in_ready,
|
|
|
|
pck_injct_out_data,
|
|
pck_injct_out_size,
|
|
pck_injct_out_endp_addr,
|
|
pck_injct_out_class_num,
|
|
pck_injct_out_init_weight,
|
|
pck_injct_out_vc,
|
|
pck_injct_out_pck_wr,
|
|
pck_injct_out_ready,
|
|
pck_injct_out_distance,
|
|
pck_injct_out_h2t_delay,
|
|
min_pck_size
|
|
|
|
|
|
);
|
|
|
|
|
|
//general
|
|
input reset,clk;
|
|
input [EAw-1 :0 ] current_e_addr;
|
|
|
|
// the destination endpoint address
|
|
//NoC interface
|
|
input smartflit_chanel_t chan_in;
|
|
output smartflit_chanel_t chan_out;
|
|
//control interafce
|
|
|
|
|
|
input [PCK_INJ_Dw-1 : 0] pck_injct_in_data;
|
|
input [PCK_SIZw-1 : 0] pck_injct_in_size;
|
|
input [EAw-1 : 0] pck_injct_in_endp_addr;
|
|
input [Cw-1 : 0] pck_injct_in_class_num;
|
|
input [WEIGHTw-1 : 0] pck_injct_in_init_weight;
|
|
input [V-1 : 0] pck_injct_in_vc;
|
|
input pck_injct_in_pck_wr;
|
|
input [V-1 : 0] pck_injct_in_ready;
|
|
|
|
output [PCK_INJ_Dw-1 : 0] pck_injct_out_data;
|
|
output [PCK_SIZw-1 : 0] pck_injct_out_size;
|
|
output [EAw-1 : 0] pck_injct_out_endp_addr;
|
|
output [Cw-1 : 0] pck_injct_out_class_num;
|
|
output [WEIGHTw-1 : 0] pck_injct_out_init_weight;
|
|
output [V-1 : 0] pck_injct_out_vc;
|
|
output pck_injct_out_pck_wr;
|
|
output [V-1 : 0] pck_injct_out_ready;
|
|
output [DISTw-1 : 0] pck_injct_out_distance;
|
|
output [15 : 0] pck_injct_out_h2t_delay;
|
|
output [4 : 0] min_pck_size;
|
|
|
|
pck_injct_t pck_injct_in;
|
|
pck_injct_t pck_injct_out;
|
|
|
|
assign pck_injct_in.data = pck_injct_in_data;
|
|
assign pck_injct_in.size = pck_injct_in_size;
|
|
assign pck_injct_in.endp_addr = pck_injct_in_endp_addr;
|
|
assign pck_injct_in.class_num = pck_injct_in_class_num;
|
|
assign pck_injct_in.init_weight = pck_injct_in_init_weight;
|
|
assign pck_injct_in.vc = pck_injct_in_vc;
|
|
assign pck_injct_in.pck_wr = pck_injct_in_pck_wr;
|
|
assign pck_injct_in.ready = pck_injct_in_ready;
|
|
|
|
assign pck_injct_out_data = pck_injct_out.data;
|
|
assign pck_injct_out_size = pck_injct_out.size;
|
|
assign pck_injct_out_endp_addr = pck_injct_out.endp_addr;
|
|
assign pck_injct_out_class_num = pck_injct_out.class_num;
|
|
assign pck_injct_out_init_weight = pck_injct_out.init_weight;
|
|
assign pck_injct_out_vc = pck_injct_out.vc;
|
|
assign pck_injct_out_pck_wr = pck_injct_out.pck_wr;
|
|
assign pck_injct_out_ready = pck_injct_out.ready;
|
|
assign pck_injct_out_distance = pck_injct_out.distance;
|
|
assign pck_injct_out_h2t_delay = pck_injct_out.h2t_delay;
|
|
|
|
packet_injector injector (
|
|
.current_e_addr (current_e_addr ),
|
|
.reset (reset ),
|
|
.clk (clk ),
|
|
.chan_in (chan_in ),
|
|
.chan_out (chan_out ),
|
|
.pck_injct_in (pck_injct_in ),
|
|
.pck_injct_out (pck_injct_out ));
|
|
|
|
|
|
localparam
|
|
HDR_BYTE_NUM = HDR_MAX_DATw / 8, // = HDR_MAX_DATw / (8 - HDR_MAX_DATw %8)
|
|
HDR_DATA_w_tmp = HDR_BYTE_NUM * 8,
|
|
HDR_DATA_w = (PCK_INJ_Dw < HDR_DATA_w_tmp)? PCK_INJ_Dw : HDR_DATA_w_tmp,
|
|
REMAIN_DATw = PCK_INJ_Dw - HDR_DATA_w,
|
|
REMAIN_DAT_FLIT_I = (REMAIN_DATw / Fpay),
|
|
REMAIN_DAT_FLIT_F = (REMAIN_DATw % Fpay == 0)? 0 : 1,
|
|
REMAIN_DAT_FLIT = REMAIN_DAT_FLIT_I + REMAIN_DAT_FLIT_F,
|
|
CNTw = log2(REMAIN_DAT_FLIT),
|
|
MIN_PCK_SIZ = REMAIN_DAT_FLIT +1;
|
|
|
|
assign min_pck_size = MIN_PCK_SIZ[4:0];
|
|
|
|
|
|
// `ifdef VERILATOR
|
|
// logic endp_is_active /*verilator public_flat_rd*/ ;
|
|
//
|
|
// always @ (*) begin
|
|
// endp_is_active = 1'b0;
|
|
// if (chan_out.flit_chanel.flit_wr) endp_is_active=1'b1;
|
|
// if (chan_out.flit_chanel.credit > {V{1'b0}} ) endp_is_active=1'b1;
|
|
// if (chan_out.smart_chanel.requests > {SMART_NUM{1'b0}} ) endp_is_active=1'b1;
|
|
// end
|
|
// `endif
|
|
|
|
|
|
endmodule
|
|