/**************************************
|
/**************************************
|
* Module: traffic_pattern
|
* Module: traffic_pattern
|
* Date:2015-10-05
|
* Date:2015-10-05
|
* Author: alireza
|
* Author: alireza
|
*
|
*
|
* Description:
|
* Description:
|
***************************************/
|
***************************************/
|
|
|
`timescale 1ns/1ps
|
`timescale 1ns/1ps
|
|
|
|
|
|
|
/************************************
|
/************************************
|
|
|
pck_class_in_gen
|
pck_class_in_gen
|
|
|
***********************************/
|
***********************************/
|
|
|
module pck_class_in_gen #(
|
module pck_class_in_gen #(
|
parameter C = 4, // number of packet class
|
parameter C = 4, // number of packet class
|
parameter C0_p = 25, // the percentage of injected packets with class 0
|
parameter C0_p = 25, // the percentage of injected packets with class 0
|
parameter C1_p = 25,
|
parameter C1_p = 25,
|
parameter C2_p = 25,
|
parameter C2_p = 25,
|
parameter C3_p = 25
|
parameter C3_p = 25
|
)(
|
)(
|
pck_class_o,
|
pck_class_o,
|
en,
|
en,
|
reset,
|
reset,
|
clk
|
clk
|
|
|
);
|
);
|
|
|
function integer log2;
|
function integer log2;
|
input integer number; begin
|
input integer number; begin
|
log2=(number <=1) ? 1: 0;
|
log2=(number <=1) ? 1: 0;
|
while(2**log2
|
while(2**log2
|
log2=log2+1;
|
log2=log2+1;
|
end
|
end
|
end
|
end
|
endfunction // log2
|
endfunction // log2
|
|
|
|
|
localparam
|
localparam
|
Cw = (C>1)? log2(C) : 1,
|
Cw = (C>1)? log2(C) : 1,
|
RNDw = log2(100);
|
RNDw = log2(100);
|
|
|
output reg [Cw-1 : 0] pck_class_o;
|
output reg [Cw-1 : 0] pck_class_o;
|
input reset,clk,en;
|
input reset,clk,en;
|
reg [RNDw-1 : 0] rnd;
|
reg [RNDw-1 : 0] rnd;
|
|
|
|
|
|
|
// generate a random num between 0 to 99
|
// generate a random num between 0 to 99
|
always @(posedge clk ) begin
|
always @(posedge clk ) begin
|
if(en | reset) begin
|
if(en | reset) begin
|
rnd = $urandom_range(99,0);
|
rnd = $urandom_range(99,0);
|
end
|
end
|
end
|
end
|
|
|
always @(*) begin
|
always @(*) begin
|
if ( rnd < C0_p) pck_class_o =0;
|
if ( rnd < C0_p) pck_class_o =0;
|
else if ( rnd < (C0_p+C1_p)) pck_class_o =1;
|
else if ( rnd < (C0_p+C1_p)) pck_class_o =1;
|
else if ( rnd < (C0_p+C1_p+C2_p)) pck_class_o =2;
|
else if ( rnd < (C0_p+C1_p+C2_p)) pck_class_o =2;
|
else pck_class_o =3;
|
else pck_class_o =3;
|
end
|
end
|
|
|
|
|
|
|
endmodule
|
endmodule
|
|
|
/**********************************
|
/**********************************
|
|
|
pck_dst_gen
|
pck_dst_gen
|
|
|
*********************************/
|
*********************************/
|
|
module pck_dst_gen
|
|
import pronoc_pkg::*;
|
|
#(
|
|
parameter NE=4,
|
|
parameter TRAFFIC = "RANDOM",
|
|
parameter MAX_PCK_NUM = 10000,
|
|
parameter HOTSPOT_NODE_NUM = 4,
|
|
parameter MCAST_TRAFFIC_RATIO =50,
|
|
parameter MCAST_PCK_SIZ_MIN = 2,
|
|
parameter MCAST_PCK_SIZ_MAX = 4,
|
|
parameter PCK_SIZw=5,
|
|
parameter MIN_PACKET_SIZE=5,
|
|
parameter MAX_PACKET_SIZE=5,
|
|
parameter PCK_SIZ_SEL="random-discrete",
|
|
parameter DISCRETE_PCK_SIZ_NUM=1
|
|
|
|
)(
|
|
en,
|
|
current_e_addr,
|
|
core_num,
|
|
pck_number,
|
|
dest_e_addr,
|
|
clk,
|
|
reset,
|
|
valid_dst,
|
|
hotspot_info,
|
|
custom_traffic_t,
|
|
custom_traffic_en,
|
|
pck_size_o,
|
|
rnd_discrete
|
|
|
module pck_dst_gen
|
|
|
);
|
|
|
|
|
|
localparam ADDR_DIMENSION = (TOPOLOGY == "MESH" || TOPOLOGY == "TORUS") ? 2 : 1; // "RING" and FULLY_CONNECT
|
|
|
|
|
|
|
|
|
|
localparam NEw= log2(NE),
|
|
PCK_CNTw = log2(MAX_PCK_NUM+1),
|
|
HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
|
|
|
|
input reset,clk,en;
|
|
input [NEw-1 : 0] core_num;
|
|
input [PCK_CNTw-1 : 0] pck_number;
|
|
input [EAw-1 : 0] current_e_addr;
|
|
output [DAw-1 : 0] dest_e_addr;
|
|
output valid_dst;
|
|
input [NEw-1 : 0] custom_traffic_t;
|
|
input custom_traffic_en;
|
|
|
|
|
|
output [PCK_SIZw-1:0] pck_size_o;
|
|
input rnd_discrete_t rnd_discrete [DISCRETE_PCK_SIZ_NUM-1: 0];
|
|
|
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
|
|
|
|
|
wire [EAw-1 : 0] unicast_dest_e_addr;
|
|
wire [PCK_SIZw-1 : 0] pck_size_uni;
|
|
|
|
pck_dst_gen_unicast #(
|
|
.NE(NE),
|
|
.TRAFFIC(TRAFFIC),
|
|
.MAX_PCK_NUM(MAX_PCK_NUM),
|
|
.HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM)
|
|
)
|
|
unicast
|
|
(
|
|
.en (en ),
|
|
.current_e_addr (current_e_addr ),
|
|
.core_num (core_num ),
|
|
.pck_number (pck_number ),
|
|
.dest_e_addr (unicast_dest_e_addr),
|
|
.clk (clk ),
|
|
.reset (reset ),
|
|
.valid_dst (valid_dst ),
|
|
.hotspot_info (hotspot_info ),
|
|
.custom_traffic_t (custom_traffic_t),
|
|
.custom_traffic_en(custom_traffic_en)
|
|
);
|
|
|
|
pck_size_gen #(
|
|
.PCK_SIZw(PCK_SIZw),
|
|
.MIN(MIN_PACKET_SIZE),
|
|
.MAX(MAX_PACKET_SIZE),
|
|
.PCK_SIZ_SEL(PCK_SIZ_SEL),
|
|
.DISCRETE_PCK_SIZ_NUM(DISCRETE_PCK_SIZ_NUM)
|
|
)
|
|
unicast_pck_size
|
|
(
|
|
.reset(reset),
|
|
.clk(clk),
|
|
.en(en),
|
|
.pck_size(pck_size_uni) ,
|
|
.rnd_discrete(rnd_discrete)
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
generate
|
|
if(CAST_TYPE == "UNICAST") begin :uni
|
|
assign dest_e_addr = unicast_dest_e_addr;
|
|
assign pck_size_o = pck_size_uni;
|
|
end else begin :multi
|
|
reg [DAw-1 : 0] multicast_dest_e_addr,temp;
|
|
reg [6: 0] rnd_reg;
|
|
wire [PCK_SIZw-1 : 0] pck_size_mcast;
|
|
reg [PCK_SIZw-1 : 0] pck_siz_tmp;
|
|
wire [NEw-1 : 0] unicast_id_num;
|
|
|
|
|
|
endp_addr_decoder #(
|
|
.T1(T1),
|
|
.T2(T2),
|
|
.T3(T3),
|
|
.NE(NE),
|
|
.EAw(EAw),
|
|
.TOPOLOGY(TOPOLOGY)
|
|
)enc
|
|
(
|
|
.code(unicast_dest_e_addr),
|
|
.id(unicast_id_num)
|
|
);
|
|
|
|
|
|
pck_size_gen #(
|
|
.PCK_SIZw(PCK_SIZw),
|
|
.MIN(MCAST_PCK_SIZ_MIN),
|
|
.MAX(MCAST_PCK_SIZ_MAX),
|
|
.PCK_SIZ_SEL("random-range"),
|
|
.DISCRETE_PCK_SIZ_NUM(DISCRETE_PCK_SIZ_NUM)
|
|
)
|
|
mcast_pck_size
|
|
(
|
|
.reset(reset),
|
|
.clk(clk),
|
|
.en(en),
|
|
.pck_size(pck_size_mcast) ,
|
|
.rnd_discrete(rnd_discrete)
|
|
);
|
|
|
|
|
|
|
|
|
|
always @(posedge clk ) begin
|
|
if(en | reset) begin
|
|
rnd_reg <= $urandom_range(99,0);
|
|
end
|
|
end
|
|
|
|
if(CAST_TYPE == "MULTICAST_FULL") begin :mful
|
|
|
|
always @( * ) begin
|
|
multicast_dest_e_addr = {DAw{1'b0}};
|
|
temp={DAw{1'b0}};
|
|
temp[unicast_id_num]=1'b1;
|
|
pck_siz_tmp= pck_size_uni;
|
|
if(rnd_reg >= MCAST_TRAFFIC_RATIO) begin
|
|
multicast_dest_e_addr[unicast_id_num]=1'b1;
|
|
end
|
|
else begin
|
|
multicast_dest_e_addr = $urandom();
|
|
pck_siz_tmp=pck_size_mcast;
|
|
end
|
|
if(SELF_LOOP_EN == "NO") multicast_dest_e_addr[core_num]=1'b0;
|
|
end
|
|
|
|
|
|
|
|
assign dest_e_addr = (multicast_dest_e_addr=={DAw{1'b0}} )? temp : multicast_dest_e_addr ;
|
|
assign pck_size_o = pck_siz_tmp;
|
|
|
|
end else if(CAST_TYPE == "MULTICAST_PARTIAL") begin :mpar
|
|
|
|
always @( * ) begin
|
|
multicast_dest_e_addr = {DAw{1'b0}};
|
|
temp={unicast_dest_e_addr,1'b1};
|
|
pck_siz_tmp= pck_size_uni;
|
|
if(rnd_reg >= MCAST_TRAFFIC_RATIO) begin
|
|
multicast_dest_e_addr = {unicast_dest_e_addr,1'b1};
|
|
end
|
|
else begin
|
|
multicast_dest_e_addr = $urandom();
|
|
multicast_dest_e_addr[0] =1'b0;
|
|
pck_siz_tmp=pck_size_mcast;
|
|
if(SELF_LOOP_EN == "NO") begin
|
|
if(MCAST_ENDP_LIST[core_num]==1'b1) multicast_dest_e_addr[endp_id_to_mcast_id(core_num)+1]=1'b0;
|
|
end
|
|
end
|
|
end
|
|
|
|
assign dest_e_addr = (multicast_dest_e_addr=={DAw{1'b0}} )? temp : multicast_dest_e_addr ;
|
|
assign pck_size_o = pck_siz_tmp;
|
|
|
|
|
|
|
|
end else begin //Broadcast
|
|
|
|
always @( * ) begin
|
|
multicast_dest_e_addr = {DAw{1'b0}};
|
|
pck_siz_tmp = pck_size_uni;
|
|
if(rnd_reg >= MCAST_TRAFFIC_RATIO) begin
|
|
multicast_dest_e_addr = {unicast_dest_e_addr,1'b1};
|
|
end
|
|
else begin
|
|
pck_siz_tmp=pck_size_mcast;
|
|
end
|
|
end
|
|
assign dest_e_addr = multicast_dest_e_addr ;
|
|
assign pck_size_o = pck_siz_tmp;
|
|
|
|
|
|
end
|
|
|
|
end endgenerate
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module pck_dst_gen_unicast
|
import pronoc_pkg::*;
|
import pronoc_pkg::*;
|
#(
|
#(
|
parameter NE=4,
|
parameter NE=4,
|
parameter TRAFFIC = "RANDOM",
|
parameter TRAFFIC = "RANDOM",
|
parameter MAX_PCK_NUM = 10000,
|
parameter MAX_PCK_NUM = 10000,
|
parameter HOTSPOT_NODE_NUM = 4
|
parameter HOTSPOT_NODE_NUM = 4
|
)(
|
)(
|
en,
|
en,
|
current_e_addr,
|
current_e_addr,
|
core_num,
|
core_num,
|
pck_number,
|
pck_number,
|
dest_e_addr,
|
dest_e_addr,
|
clk,
|
clk,
|
reset,
|
reset,
|
valid_dst,
|
valid_dst,
|
hotspot_info,
|
hotspot_info,
|
custom_traffic_t,
|
custom_traffic_t,
|
custom_traffic_en
|
custom_traffic_en
|
);
|
);
|
|
|
|
|
localparam ADDR_DIMENSION = (TOPOLOGY == "MESH" || TOPOLOGY == "TORUS") ? 2 : 1; // "RING" and FULLY_CONNECT
|
localparam ADDR_DIMENSION = (TOPOLOGY == "MESH" || TOPOLOGY == "TORUS") ? 2 : 1; // "RING" and FULLY_CONNECT
|
|
|
|
|
function integer log2;
|
function integer log2;
|
input integer number; begin
|
input integer number; begin
|
log2=(number <=1) ? 1: 0;
|
log2=(number <=1) ? 1: 0;
|
while(2**log2
|
while(2**log2
|
log2=log2+1;
|
log2=log2+1;
|
end
|
end
|
end
|
end
|
endfunction // log2
|
endfunction // log2
|
|
|
|
|
localparam NEw= log2(NE),
|
localparam NEw= log2(NE),
|
PCK_CNTw = log2(MAX_PCK_NUM+1),
|
PCK_CNTw = log2(MAX_PCK_NUM+1),
|
HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
|
HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
|
|
|
input reset,clk,en;
|
input reset,clk,en;
|
input [NEw-1 : 0] core_num;
|
input [NEw-1 : 0] core_num;
|
input [PCK_CNTw-1 : 0] pck_number;
|
input [PCK_CNTw-1 : 0] pck_number;
|
input [EAw-1 : 0] current_e_addr;
|
input [EAw-1 : 0] current_e_addr;
|
output [EAw-1 : 0] dest_e_addr;
|
output [EAw-1 : 0] dest_e_addr;
|
output valid_dst;
|
output valid_dst;
|
input [NEw-1 : 0] custom_traffic_t;
|
input [NEw-1 : 0] custom_traffic_t;
|
input custom_traffic_en;
|
input custom_traffic_en;
|
|
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
|
|
|
|
generate
|
generate
|
if ( ADDR_DIMENSION == 2) begin :two_dim
|
if ( ADDR_DIMENSION == 2) begin :two_dim
|
|
|
two_dimension_pck_dst_gen #(
|
two_dimension_pck_dst_gen #(
|
.NE(NE),
|
.NE(NE),
|
.TRAFFIC(TRAFFIC),
|
.TRAFFIC(TRAFFIC),
|
.MAX_PCK_NUM(MAX_PCK_NUM),
|
.MAX_PCK_NUM(MAX_PCK_NUM),
|
.HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM)
|
.HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM)
|
|
|
)
|
)
|
the_two_dimension_pck_dst_gen
|
the_two_dimension_pck_dst_gen
|
(
|
(
|
.reset(reset),
|
.reset(reset),
|
.clk(clk),
|
.clk(clk),
|
.en(en),
|
.en(en),
|
.core_num(core_num),
|
.core_num(core_num),
|
.pck_number(pck_number),
|
.pck_number(pck_number),
|
.current_e_addr(current_e_addr),
|
.current_e_addr(current_e_addr),
|
.dest_e_addr(dest_e_addr),
|
.dest_e_addr(dest_e_addr),
|
.valid_dst(valid_dst),
|
.valid_dst(valid_dst),
|
.hotspot_info(hotspot_info),
|
.hotspot_info(hotspot_info),
|
.custom_traffic_t(custom_traffic_t),
|
.custom_traffic_t(custom_traffic_t),
|
.custom_traffic_en(custom_traffic_en)
|
.custom_traffic_en(custom_traffic_en)
|
);
|
);
|
|
|
end else begin : one_dim
|
end else begin : one_dim
|
|
|
one_dimension_pck_dst_gen #(
|
one_dimension_pck_dst_gen #(
|
.NE(NE),
|
.NE(NE),
|
.TRAFFIC(TRAFFIC),
|
.TRAFFIC(TRAFFIC),
|
.MAX_PCK_NUM(MAX_PCK_NUM),
|
.MAX_PCK_NUM(MAX_PCK_NUM),
|
.HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM)
|
.HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM)
|
)
|
)
|
the_one_dimension_pck_dst_gen
|
the_one_dimension_pck_dst_gen
|
(
|
(
|
.reset(reset),
|
.reset(reset),
|
.clk(clk),
|
.clk(clk),
|
.en(en),
|
.en(en),
|
.core_num(core_num),
|
.core_num(core_num),
|
.pck_number(pck_number),
|
.pck_number(pck_number),
|
.current_e_addr(current_e_addr),
|
.current_e_addr(current_e_addr),
|
.dest_e_addr(dest_e_addr),
|
.dest_e_addr(dest_e_addr),
|
.valid_dst(valid_dst),
|
.valid_dst(valid_dst),
|
.hotspot_info(hotspot_info),
|
.hotspot_info(hotspot_info),
|
.custom_traffic_t(custom_traffic_t),
|
.custom_traffic_t(custom_traffic_t),
|
.custom_traffic_en(custom_traffic_en)
|
.custom_traffic_en(custom_traffic_en)
|
);
|
);
|
|
|
end
|
end
|
endgenerate
|
endgenerate
|
endmodule
|
endmodule
|
|
|
|
|
|
|
|
|
module two_dimension_pck_dst_gen
|
module two_dimension_pck_dst_gen
|
import pronoc_pkg::*;
|
import pronoc_pkg::*;
|
#(
|
#(
|
parameter NE=4,
|
parameter NE=4,
|
parameter TRAFFIC = "RANDOM",
|
parameter TRAFFIC = "RANDOM",
|
parameter MAX_PCK_NUM = 10000,
|
parameter MAX_PCK_NUM = 10000,
|
parameter HOTSPOT_NODE_NUM = 4
|
parameter HOTSPOT_NODE_NUM = 4
|
|
|
)(
|
)(
|
en,
|
en,
|
current_e_addr,
|
current_e_addr,
|
dest_e_addr,
|
dest_e_addr,
|
core_num,
|
core_num,
|
pck_number,
|
pck_number,
|
clk,
|
clk,
|
reset,
|
reset,
|
valid_dst,
|
valid_dst,
|
hotspot_info,
|
hotspot_info,
|
custom_traffic_t,
|
custom_traffic_t,
|
custom_traffic_en
|
custom_traffic_en
|
);
|
);
|
|
|
|
|
function integer log2;
|
function integer log2;
|
input integer number; begin
|
input integer number; begin
|
log2=(number <=1) ? 1: 0;
|
log2=(number <=1) ? 1: 0;
|
while(2**log2
|
while(2**log2
|
log2=log2+1;
|
log2=log2+1;
|
end
|
end
|
end
|
end
|
endfunction // log2
|
endfunction // log2
|
|
|
|
|
localparam NEw= log2(NE),
|
localparam NEw= log2(NE),
|
PCK_CNTw = log2(MAX_PCK_NUM+1),
|
PCK_CNTw = log2(MAX_PCK_NUM+1),
|
HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
|
HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
|
|
|
input reset,clk,en;
|
input reset,clk,en;
|
input [NEw-1 : 0] core_num;
|
input [NEw-1 : 0] core_num;
|
input [PCK_CNTw-1 : 0] pck_number;
|
input [PCK_CNTw-1 : 0] pck_number;
|
input [EAw-1 : 0] current_e_addr;
|
input [EAw-1 : 0] current_e_addr;
|
output [EAw-1 : 0] dest_e_addr;
|
output [EAw-1 : 0] dest_e_addr;
|
output valid_dst;
|
output valid_dst;
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
input [NEw-1 : 0] custom_traffic_t;
|
input [NEw-1 : 0] custom_traffic_t;
|
input custom_traffic_en;
|
input custom_traffic_en;
|
|
|
localparam
|
localparam
|
NX = T1,
|
NX = T1,
|
NY = T2,
|
NY = T2,
|
NL = T3,
|
NL = T3,
|
NXw = log2(NX),
|
NXw = log2(NX),
|
NYw= log2(NY),
|
NYw= log2(NY),
|
NLw= log2(NL);
|
NLw= log2(NL);
|
|
|
wire [NXw-1 : 0] current_x;
|
wire [NXw-1 : 0] current_x;
|
wire [NYw-1 : 0] current_y;
|
wire [NYw-1 : 0] current_y;
|
wire [NLw-1 : 0] current_l;
|
wire [NLw-1 : 0] current_l;
|
wire [NXw-1 : 0] dest_x;
|
wire [NXw-1 : 0] dest_x;
|
wire [NYw-1 : 0] dest_y;
|
wire [NYw-1 : 0] dest_y;
|
wire [NLw-1 : 0] dest_l;
|
wire [NLw-1 : 0] dest_l;
|
|
|
mesh_tori_endp_addr_decode #(
|
mesh_tori_endp_addr_decode #(
|
.TOPOLOGY(TOPOLOGY),
|
.TOPOLOGY(TOPOLOGY),
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.EAw(EAw)
|
.EAw(EAw)
|
)
|
)
|
src_addr_decode
|
src_addr_decode
|
(
|
(
|
.e_addr(current_e_addr),
|
.e_addr(current_e_addr),
|
.ex(current_x),
|
.ex(current_x),
|
.ey(current_y),
|
.ey(current_y),
|
.el(current_l),
|
.el(current_l),
|
.valid( )
|
.valid( )
|
);
|
);
|
|
|
wire off_flag;
|
wire off_flag;
|
|
|
|
|
|
|
|
|
|
|
wire [NEw-1 : 0] dest_ip_num;
|
wire [NEw-1 : 0] dest_ip_num;
|
genvar i;
|
genvar i;
|
|
|
generate
|
generate
|
if (TRAFFIC == "RANDOM") begin
|
if (TRAFFIC == "RANDOM") begin
|
|
|
logic [6 : 0] rnd_reg;
|
logic [6 : 0] rnd_reg;
|
|
|
always @(posedge clk ) begin
|
always @(posedge clk ) begin
|
if(en | reset) begin
|
if(en | reset) begin
|
rnd_reg = $urandom_range(NE-1,0);
|
rnd_reg = $urandom_range(NE-1,0);
|
if(SELF_LOOP_EN == "NO") while(rnd_reg==core_num) rnd_reg = $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
|
if(SELF_LOOP_EN == "NO") while(rnd_reg==core_num) rnd_reg = $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
|
|
|
end
|
end
|
end
|
end
|
assign dest_ip_num = rnd_reg;
|
assign dest_ip_num = rnd_reg;
|
|
|
endp_addr_encoder #(
|
endp_addr_encoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)
|
)
|
addr_encoder
|
addr_encoder
|
(
|
(
|
.id(dest_ip_num),
|
.id(dest_ip_num),
|
.code(dest_e_addr)
|
.code(dest_e_addr)
|
);
|
);
|
|
|
end else if (TRAFFIC == "HOTSPOT") begin
|
end else if (TRAFFIC == "HOTSPOT") begin
|
|
|
hot_spot_dest_gen #(
|
hot_spot_dest_gen #(
|
.HOTSPOT_NUM(HOTSPOT_NUM),
|
.HOTSPOT_NUM(HOTSPOT_NUM),
|
.NE(NE),
|
.NE(NE),
|
.NEw(NEw)
|
.NEw(NEw)
|
)hspot
|
)hspot
|
(
|
(
|
.reset(reset),
|
.reset(reset),
|
.clk(clk),
|
.clk(clk),
|
.en(en),
|
.en(en),
|
.hotspot_info(hotspot_info),
|
.hotspot_info(hotspot_info),
|
.dest_ip_num (dest_ip_num),
|
.dest_ip_num (dest_ip_num),
|
.core_num(core_num),
|
.core_num(core_num),
|
.off_flag(off_flag)
|
.off_flag(off_flag)
|
);
|
);
|
|
|
endp_addr_encoder #(
|
endp_addr_encoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)
|
)
|
addr_encoder
|
addr_encoder
|
(
|
(
|
.id(dest_ip_num),
|
.id(dest_ip_num),
|
.code(dest_e_addr)
|
.code(dest_e_addr)
|
);
|
);
|
|
|
|
|
|
|
end else if( TRAFFIC == "TRANSPOSE1") begin
|
end else if( TRAFFIC == "TRANSPOSE1") begin
|
|
|
assign dest_x = NX-current_y-1;
|
assign dest_x = NX-current_y-1;
|
assign dest_y = NY-current_x-1;
|
assign dest_y = NY-current_x-1;
|
assign dest_l = NL-current_l-1;
|
assign dest_l = NL-current_l-1;
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
|
|
endp_addr_decoder #(
|
endp_addr_decoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)enc
|
)enc
|
(
|
(
|
.code(dest_e_addr),
|
.code(dest_e_addr),
|
.id(dest_ip_num)
|
.id(dest_ip_num)
|
);
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
end else if( TRAFFIC == "TRANSPOSE2") begin :transpose2
|
end else if( TRAFFIC == "TRANSPOSE2") begin :transpose2
|
|
|
assign dest_x = current_y;
|
assign dest_x = current_y;
|
assign dest_y = current_x;
|
assign dest_y = current_x;
|
assign dest_l = current_l;
|
assign dest_l = current_l;
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
|
|
endp_addr_decoder #(
|
endp_addr_decoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)enc
|
)enc
|
(
|
(
|
.code(dest_e_addr),
|
.code(dest_e_addr),
|
.id(dest_ip_num)
|
.id(dest_ip_num)
|
);
|
);
|
|
|
|
|
|
|
end else if( TRAFFIC == "BIT_REVERSE") begin :bitreverse
|
end else if( TRAFFIC == "BIT_REVERSE") begin :bitreverse
|
|
|
for(i=0; i<(EAw); i=i+1'b1) begin :lp//reverse the address
|
for(i=0; i<(EAw); i=i+1'b1) begin :lp//reverse the address
|
assign dest_ip_num[i] = current_e_addr [((EAw)-1)-i];
|
assign dest_ip_num[i] = current_e_addr [((EAw)-1)-i];
|
end
|
end
|
|
|
endp_addr_encoder #(
|
endp_addr_encoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)
|
)
|
addr_encoder(
|
addr_encoder(
|
.id(dest_ip_num),
|
.id(dest_ip_num),
|
.code(dest_e_addr)
|
.code(dest_e_addr)
|
);
|
);
|
|
|
|
|
end else if( TRAFFIC == "BIT_COMPLEMENT") begin :bitcomp
|
end else if( TRAFFIC == "BIT_COMPLEMENT") begin :bitcomp
|
|
|
assign dest_x = ~current_x;
|
assign dest_x = ~current_x;
|
assign dest_y = ~current_y;
|
assign dest_y = ~current_y;
|
assign dest_l = ~dest_l;
|
assign dest_l = ~dest_l;
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
|
|
endp_addr_decoder #(
|
endp_addr_decoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)enc
|
)enc
|
(
|
(
|
.code(dest_e_addr),
|
.code(dest_e_addr),
|
.id(dest_ip_num)
|
.id(dest_ip_num)
|
);
|
);
|
|
|
|
|
|
|
|
|
end else if( TRAFFIC == "TORNADO" ) begin :tornado
|
end else if( TRAFFIC == "TORNADO" ) begin :tornado
|
//[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
|
//[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
|
assign dest_x = (current_x> ((NX+1)/2))? current_x- ((NX+1)/2) -1 : (NX/2)+current_x-1; // = ((current_x + ((NX/2)-1))%NX);
|
assign dest_x = (current_x> ((NX+1)/2))? current_x- ((NX+1)/2) -1 : (NX/2)+current_x-1; // = ((current_x + ((NX/2)-1))%NX);
|
assign dest_y = (current_y> ((NY+1)/2))? current_y- ((NY+1)/2) -1 : (NY/2)+current_y-1; // = ((current_y + ((NY/2)-1))%NY);
|
assign dest_y = (current_y> ((NY+1)/2))? current_y- ((NY+1)/2) -1 : (NY/2)+current_y-1; // = ((current_y + ((NY/2)-1))%NY);
|
assign dest_l = current_l;
|
assign dest_l = current_l;
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
|
|
endp_addr_decoder #(
|
endp_addr_decoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)enc
|
)enc
|
(
|
(
|
.code(dest_e_addr),
|
.code(dest_e_addr),
|
.id(dest_ip_num)
|
.id(dest_ip_num)
|
);
|
);
|
|
|
|
|
|
|
|
|
end else if( TRAFFIC == "NEIGHBOR") begin :neighbor
|
end else if( TRAFFIC == "NEIGHBOR") begin :neighbor
|
//dx = sx + 1 mod k
|
//dx = sx + 1 mod k
|
assign dest_x = (current_x + 1) >= NX? 0 : (current_x + 1);
|
assign dest_x = (current_x + 1) >= NX? 0 : (current_x + 1);
|
assign dest_y = (current_y + 1) >= NY? 0 : (current_y + 1);
|
assign dest_y = (current_y + 1) >= NY? 0 : (current_y + 1);
|
assign dest_l = current_l;
|
assign dest_l = current_l;
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
|
|
|
endp_addr_decoder #(
|
endp_addr_decoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)enc
|
)enc
|
(
|
(
|
.code(dest_e_addr),
|
.code(dest_e_addr),
|
.id(dest_ip_num)
|
.id(dest_ip_num)
|
);
|
);
|
|
|
|
|
|
|
|
|
end else if( TRAFFIC == "SHUFFLE") begin: shuffle
|
end else if( TRAFFIC == "SHUFFLE") begin: shuffle
|
//di = si−1 mod b
|
//di = si−1 mod b
|
for(i=1; i<(EAw); i=i+1'b1) begin :lp//reverse the address
|
for(i=1; i<(EAw); i=i+1'b1) begin :lp//reverse the address
|
assign dest_ip_num[i] = current_e_addr [i-1];
|
assign dest_ip_num[i] = current_e_addr [i-1];
|
end
|
end
|
assign dest_ip_num[0] = current_e_addr [EAw-1];
|
assign dest_ip_num[0] = current_e_addr [EAw-1];
|
endp_addr_encoder #(
|
endp_addr_encoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)
|
)
|
addr_encoder(
|
addr_encoder(
|
.id(dest_ip_num),
|
.id(dest_ip_num),
|
.code(dest_e_addr)
|
.code(dest_e_addr)
|
);
|
);
|
|
|
|
|
end else if(TRAFFIC == "BIT_ROTATION") begin :bitrot
|
end else if(TRAFFIC == "BIT_ROTATION") begin :bitrot
|
//di = si+1 mod b
|
//di = si+1 mod b
|
for(i=0; i<(EAw-1); i=i+1'b1) begin :lp//reverse the address
|
for(i=0; i<(EAw-1); i=i+1'b1) begin :lp//reverse the address
|
assign dest_ip_num[i] = current_e_addr [i+1];
|
assign dest_ip_num[i] = current_e_addr [i+1];
|
end
|
end
|
assign dest_ip_num[EAw-1] = current_e_addr [0];
|
assign dest_ip_num[EAw-1] = current_e_addr [0];
|
endp_addr_encoder #(
|
endp_addr_encoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)
|
)
|
addr_encoder(
|
addr_encoder(
|
.id(dest_ip_num),
|
.id(dest_ip_num),
|
.code(dest_e_addr)
|
.code(dest_e_addr)
|
);
|
);
|
|
|
end else if(TRAFFIC == "CUSTOM" )begin
|
end else if(TRAFFIC == "CUSTOM" )begin
|
|
|
assign dest_ip_num = custom_traffic_t;
|
assign dest_ip_num = custom_traffic_t;
|
endp_addr_encoder #(
|
endp_addr_encoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)
|
)
|
addr_encoder
|
addr_encoder
|
(
|
(
|
.id(dest_ip_num),
|
.id(dest_ip_num),
|
.code(dest_e_addr)
|
.code(dest_e_addr)
|
);
|
);
|
|
|
assign off_flag = ~custom_traffic_en;
|
assign off_flag = ~custom_traffic_en;
|
|
|
|
|
end else begin
|
end else begin
|
initial begin
|
initial begin
|
$display("ERROR: Undefined Traffic pattern:%s",TRAFFIC);
|
$display("ERROR: Undefined Traffic pattern:%s",TRAFFIC);
|
$stop;
|
$stop;
|
end
|
end
|
end
|
end
|
|
|
|
|
|
|
wire valid_temp = (dest_ip_num <= (NE-1));
|
wire valid_temp = (dest_ip_num <= (NE-1));
|
|
|
if (TRAFFIC == "HOTSPOT" || TRAFFIC == "CUSTOM") begin
|
if (TRAFFIC == "HOTSPOT" || TRAFFIC == "CUSTOM") begin
|
assign valid_dst = ~off_flag & valid_temp;
|
assign valid_dst = ~off_flag & valid_temp;
|
end else begin
|
end else begin
|
assign valid_dst = valid_temp;
|
assign valid_dst = valid_temp;
|
end
|
end
|
|
|
|
|
endgenerate
|
endgenerate
|
|
|
endmodule
|
endmodule
|
|
|
|
|
|
|
/************
|
/************
|
|
|
************/
|
************/
|
|
|
|
|
module one_dimension_pck_dst_gen
|
module one_dimension_pck_dst_gen
|
import pronoc_pkg::*;
|
import pronoc_pkg::*;
|
#(
|
#(
|
parameter NE=4,
|
parameter NE=4,
|
parameter TRAFFIC = "RANDOM",
|
parameter TRAFFIC = "RANDOM",
|
parameter MAX_PCK_NUM = 10000,
|
parameter MAX_PCK_NUM = 10000,
|
parameter HOTSPOT_NODE_NUM = 4
|
parameter HOTSPOT_NODE_NUM = 4
|
|
|
)(
|
)(
|
en,
|
en,
|
core_num,
|
core_num,
|
pck_number,
|
pck_number,
|
current_e_addr,
|
current_e_addr,
|
dest_e_addr,
|
dest_e_addr,
|
clk,
|
clk,
|
reset,
|
reset,
|
valid_dst,
|
valid_dst,
|
hotspot_info,
|
hotspot_info,
|
custom_traffic_t,
|
custom_traffic_t,
|
custom_traffic_en
|
custom_traffic_en
|
);
|
);
|
|
|
function integer log2;
|
function integer log2;
|
input integer number; begin
|
input integer number; begin
|
log2=(number <=1) ? 1: 0;
|
log2=(number <=1) ? 1: 0;
|
while(2**log2
|
while(2**log2
|
log2=log2+1;
|
log2=log2+1;
|
end
|
end
|
end
|
end
|
endfunction // log2
|
endfunction // log2
|
|
|
|
|
localparam
|
localparam
|
NEw= log2(NE),
|
NEw= log2(NE),
|
PCK_CNTw = log2(MAX_PCK_NUM+1),
|
PCK_CNTw = log2(MAX_PCK_NUM+1),
|
HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
|
HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
|
|
|
input reset,clk,en;
|
input reset,clk,en;
|
input [NEw-1 : 0] core_num;
|
input [NEw-1 : 0] core_num;
|
input [PCK_CNTw-1 : 0] pck_number;
|
input [PCK_CNTw-1 : 0] pck_number;
|
input [EAw-1 : 0] current_e_addr;
|
input [EAw-1 : 0] current_e_addr;
|
output [EAw-1 : 0] dest_e_addr;
|
output [EAw-1 : 0] dest_e_addr;
|
output valid_dst;
|
output valid_dst;
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
input [NEw-1 : 0] custom_traffic_t;
|
input [NEw-1 : 0] custom_traffic_t;
|
input custom_traffic_en;
|
input custom_traffic_en;
|
|
|
wire [NEw-1 : 0] dest_ip_num;
|
wire [NEw-1 : 0] dest_ip_num;
|
wire off_flag;
|
wire off_flag;
|
genvar i;
|
genvar i;
|
generate
|
generate
|
if (TRAFFIC == "RANDOM") begin
|
if (TRAFFIC == "RANDOM") begin
|
logic [6 : 0] rnd_reg;
|
logic [6 : 0] rnd_reg;
|
|
|
always @(posedge clk ) begin
|
always @(posedge clk ) begin
|
if(en | reset) begin
|
if(en | reset) begin
|
rnd_reg = $urandom_range(NE-1,0);
|
rnd_reg = $urandom_range(NE-1,0);
|
if(SELF_LOOP_EN == "NO") while(rnd_reg==core_num) rnd_reg = $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
|
if(SELF_LOOP_EN == "NO") while(rnd_reg==core_num) rnd_reg = $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
|
end
|
end
|
end
|
end
|
assign dest_ip_num = rnd_reg;
|
assign dest_ip_num = rnd_reg;
|
|
|
|
|
end else if (TRAFFIC == "HOTSPOT") begin
|
end else if (TRAFFIC == "HOTSPOT") begin
|
|
|
hot_spot_dest_gen #(
|
hot_spot_dest_gen #(
|
.HOTSPOT_NUM(HOTSPOT_NUM),
|
.HOTSPOT_NUM(HOTSPOT_NUM),
|
.NE(NE),
|
.NE(NE),
|
.NEw(NEw)
|
.NEw(NEw)
|
)hspot
|
)hspot
|
(
|
(
|
.clk(clk),
|
.clk(clk),
|
.en(en),
|
.en(en),
|
.hotspot_info(hotspot_info),
|
.hotspot_info(hotspot_info),
|
.dest_ip_num (dest_ip_num),
|
.dest_ip_num (dest_ip_num),
|
.core_num(core_num),
|
.core_num(core_num),
|
.off_flag(off_flag)
|
.off_flag(off_flag)
|
);
|
);
|
|
|
|
|
|
|
end else if( TRAFFIC == "TRANSPOSE1") begin :tran1
|
end else if( TRAFFIC == "TRANSPOSE1") begin :tran1
|
|
|
assign dest_ip_num = NE-core_num-1;
|
assign dest_ip_num = NE-core_num-1;
|
|
|
end else if( TRAFFIC == "BIT_REVERSE") begin :bitreverse
|
end else if( TRAFFIC == "BIT_REVERSE") begin :bitreverse
|
|
|
for(i=0; i
|
for(i=0; i
|
assign dest_ip_num[i] = core_num [NEw-1-i];
|
assign dest_ip_num[i] = core_num [NEw-1-i];
|
end
|
end
|
|
|
end else if( TRAFFIC == "BIT_COMPLEMENT") begin :bitcomp
|
end else if( TRAFFIC == "BIT_COMPLEMENT") begin :bitcomp
|
|
|
assign dest_ip_num = ~core_num;
|
assign dest_ip_num = ~core_num;
|
|
|
end else if( TRAFFIC == "TORNADO" ) begin :tornado
|
end else if( TRAFFIC == "TORNADO" ) begin :tornado
|
//[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
|
//[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
|
assign dest_ip_num = (core_num > ((NE+1)/2))? core_num- ((NE+1)/2) -1 : (NE/2)+core_num-1; // = ((current_x + ((NX/2)-1))%NX);
|
assign dest_ip_num = (core_num > ((NE+1)/2))? core_num- ((NE+1)/2) -1 : (NE/2)+core_num-1; // = ((current_x + ((NX/2)-1))%NX);
|
|
|
end else if( TRAFFIC == "NEIGHBOR") begin :neighbor
|
end else if( TRAFFIC == "NEIGHBOR") begin :neighbor
|
//dx = sx + 1 mod k
|
//dx = sx + 1 mod k
|
assign dest_ip_num = ((core_num + 1) >= NE) ? 0 : (core_num + 1);
|
assign dest_ip_num = ((core_num + 1) >= NE) ? 0 : (core_num + 1);
|
|
|
end else if( TRAFFIC == "SHUFFLE") begin: shuffle
|
end else if( TRAFFIC == "SHUFFLE") begin: shuffle
|
//di = si−1 mod b
|
//di = si−1 mod b
|
for(i=1; i<(NEw); i=i+1'b1) begin :lp
|
for(i=1; i<(NEw); i=i+1'b1) begin :lp
|
assign dest_ip_num[i] = core_num [i-1];
|
assign dest_ip_num[i] = core_num [i-1];
|
end
|
end
|
assign dest_ip_num[0] = core_num [NEw-1];
|
assign dest_ip_num[0] = core_num [NEw-1];
|
|
|
end else if(TRAFFIC == "BIT_ROTATION") begin :bitrot
|
end else if(TRAFFIC == "BIT_ROTATION") begin :bitrot
|
//di = si+1 mod b
|
//di = si+1 mod b
|
for(i=0; i<(NEw-1); i=i+1) begin :lp//reverse the address
|
for(i=0; i<(NEw-1); i=i+1) begin :lp//reverse the address
|
assign dest_ip_num[i] = core_num [i+1];
|
assign dest_ip_num[i] = core_num [i+1];
|
end
|
end
|
assign dest_ip_num[NEw-1] = core_num [0];
|
assign dest_ip_num[NEw-1] = core_num [0];
|
|
|
end else if(TRAFFIC == "CUSTOM" )begin
|
end else if(TRAFFIC == "CUSTOM" )begin
|
assign off_flag = ~custom_traffic_en;
|
assign off_flag = ~custom_traffic_en;
|
assign dest_ip_num = custom_traffic_t;
|
assign dest_ip_num = custom_traffic_t;
|
end
|
end
|
|
|
endp_addr_encoder #(
|
endp_addr_encoder #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.NE(NE),
|
.NE(NE),
|
.EAw(EAw),
|
.EAw(EAw),
|
.TOPOLOGY(TOPOLOGY)
|
.TOPOLOGY(TOPOLOGY)
|
)
|
)
|
addr_encoder
|
addr_encoder
|
(
|
(
|
.id(dest_ip_num),
|
.id(dest_ip_num),
|
.code(dest_e_addr)
|
.code(dest_e_addr)
|
);
|
);
|
|
|
wire valid_temp = (dest_ip_num <= (NE-1));
|
wire valid_temp = (dest_ip_num <= (NE-1));
|
|
|
if (TRAFFIC == "HOTSPOT" || TRAFFIC == "CUSTOM") begin
|
if (TRAFFIC == "HOTSPOT" || TRAFFIC == "CUSTOM") begin
|
assign valid_dst = ~off_flag & valid_temp;
|
assign valid_dst = ~off_flag & valid_temp;
|
end else begin
|
end else begin
|
assign valid_dst = valid_temp;
|
assign valid_dst = valid_temp;
|
end
|
end
|
|
|
endgenerate
|
endgenerate
|
|
|
endmodule
|
endmodule
|
|
|
/***************************
|
/***************************
|
* pck_size_gen
|
* pck_size_gen
|
* *************************/
|
* *************************/
|
|
|
module pck_size_gen
|
module pck_size_gen
|
import pronoc_pkg::*;
|
import pronoc_pkg::*;
|
#(
|
#(
|
parameter PCK_SIZw=4,
|
parameter PCK_SIZw=4,
|
parameter MIN = 2,
|
parameter MIN = 2,
|
parameter MAX = 5,
|
parameter MAX = 5,
|
parameter PCK_SIZ_SEL="random-discrete",
|
parameter PCK_SIZ_SEL="random-discrete",
|
parameter DISCRETE_PCK_SIZ_NUM=1
|
parameter DISCRETE_PCK_SIZ_NUM=1
|
)
|
)
|
(
|
(
|
reset,
|
reset,
|
clk,
|
clk,
|
en,
|
en,
|
pck_size,
|
pck_size,
|
rnd_discrete
|
rnd_discrete
|
);
|
);
|
|
|
input rnd_discrete_t rnd_discrete [DISCRETE_PCK_SIZ_NUM-1: 0];
|
input rnd_discrete_t rnd_discrete [DISCRETE_PCK_SIZ_NUM-1: 0];
|
|
|
|
|
input reset, clk, en;
|
input reset, clk, en;
|
output [PCK_SIZw-1 : 0] pck_size;
|
output [PCK_SIZw-1 : 0] pck_size;
|
|
|
|
|
generate
|
generate
|
if(PCK_SIZ_SEL == "random-discrete" ) begin :discrete
|
if(PCK_SIZ_SEL == "random-discrete" ) begin :discrete
|
if(DISCRETE_PCK_SIZ_NUM==1) begin :single
|
if(DISCRETE_PCK_SIZ_NUM==1) begin :single
|
assign pck_size = rnd_discrete[0].value;
|
assign pck_size = rnd_discrete[0].value;
|
end else begin :multi
|
end else begin :multi
|
reg [PCK_SIZw-1 : 0] rnd,rnd_next;
|
reg [PCK_SIZw-1 : 0] rnd,rnd_next;
|
integer rnd2;
|
integer rnd2;
|
integer k;
|
integer k;
|
always @(*) begin
|
always @(*) begin
|
rnd_next = rnd;
|
rnd_next = rnd;
|
if(en) begin
|
if(en) begin
|
if(rnd2 < rnd_discrete[0].percentage) rnd_next = rnd_discrete[0].value;
|
if(rnd2 < rnd_discrete[0].percentage) rnd_next = rnd_discrete[0].value;
|
for (k=1;k
|
for (k=1;k
|
if(rnd2 >= rnd_discrete[k-1].percentage && rnd2 < rnd_discrete[k].percentage) rnd_next = rnd_discrete[k].value;
|
if(rnd2 >= rnd_discrete[k-1].percentage && rnd2 < rnd_discrete[k].percentage) rnd_next = rnd_discrete[k].value;
|
end
|
end
|
end
|
end
|
end//always
|
end//always
|
|
|
|
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
if(reset) begin
|
if(reset) begin
|
rnd2<= 0;
|
rnd2<= 0;
|
rnd <= rnd_discrete[0].value;
|
rnd <= rnd_discrete[0].value;
|
end else begin
|
end else begin
|
if(en) rnd2<= $urandom_range(99,0);
|
if(en) rnd2<= $urandom_range(99,0);
|
rnd <= rnd_next;
|
rnd <= rnd_next;
|
end
|
end
|
end//always
|
end//always
|
|
|
assign pck_size = rnd;
|
assign pck_size = rnd;
|
end//multi
|
end//multi
|
|
|
end else begin :range
|
end else begin :range
|
if (MIN == MAX) begin :eq
|
if (MIN == MAX) begin :eq
|
assign pck_size = MIN;
|
assign pck_size = MIN;
|
end else begin :noteq
|
end else begin :noteq
|
reg [PCK_SIZw-1 : 0] rnd;
|
reg [PCK_SIZw-1 : 0] rnd;
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
if(reset) rnd = MIN;
|
if(reset) rnd = MIN;
|
else if(en) rnd = $urandom_range(MAX,MIN);
|
else if(en) rnd = $urandom_range(MAX,MIN);
|
end
|
end
|
assign pck_size = rnd;
|
assign pck_size = rnd;
|
end
|
end
|
end
|
end
|
endgenerate
|
endgenerate
|
endmodule
|
endmodule
|
|
|
|
|
|
|
|
|
module hot_spot_dest_gen
|
module hot_spot_dest_gen
|
import pronoc_pkg::*;
|
import pronoc_pkg::*;
|
#(
|
#(
|
parameter HOTSPOT_NUM=2,
|
parameter HOTSPOT_NUM=2,
|
parameter NE=16,
|
parameter NE=16,
|
parameter NEw=4
|
parameter NEw=4
|
)
|
)
|
(
|
(
|
clk,
|
clk,
|
reset,
|
reset,
|
en,
|
en,
|
hotspot_info,
|
hotspot_info,
|
core_num,
|
core_num,
|
dest_ip_num,
|
dest_ip_num,
|
off_flag
|
off_flag
|
);
|
);
|
|
|
input clk,en,reset;
|
input clk,en,reset;
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
input hotspot_t hotspot_info [HOTSPOT_NUM-1 : 0];
|
input [NEw-1 : 0] core_num;
|
input [NEw-1 : 0] core_num;
|
output [NEw-1 : 0] dest_ip_num;
|
output [NEw-1 : 0] dest_ip_num;
|
output reg off_flag;
|
output reg off_flag;
|
|
|
logic [6 : 0] rnd_reg, hotspot_node;
|
logic [6 : 0] rnd_reg, hotspot_node;
|
reg [9 : 0] rnd1000;
|
reg [9 : 0] rnd1000;
|
always @(posedge clk ) begin
|
always @(posedge clk ) begin
|
if(en | reset) begin
|
if(en | reset) begin
|
rnd_reg = $urandom_range(NE-1,0);
|
rnd_reg = $urandom_range(NE-1,0);
|
if(SELF_LOOP_EN == "NO") while(rnd_reg==core_num) rnd_reg = $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
|
if(SELF_LOOP_EN == "NO") while(rnd_reg==core_num) rnd_reg = $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
|
|
|
rnd1000 = $urandom_range(999,0);// generate a random number between 0 & 1000
|
rnd1000 = $urandom_range(999,0);// generate a random number between 0 & 1000
|
end
|
end
|
end
|
end
|
|
|
logic hotspot_flag;
|
logic hotspot_flag;
|
integer i;
|
integer i;
|
|
|
always @(*)begin
|
always @(*)begin
|
off_flag=0;
|
off_flag=0;
|
for (i=0;i
|
for (i=0;i
|
if ( hotspot_info[i].send_enable == 0 && core_num ==hotspot_info[i].ip_num)begin
|
if ( hotspot_info[i].send_enable == 0 && core_num ==hotspot_info[i].ip_num)begin
|
off_flag=1;
|
off_flag=1;
|
end
|
end
|
end
|
end
|
hotspot_flag=0;
|
hotspot_flag=0;
|
hotspot_node=0;
|
hotspot_node=0;
|
if ( rnd1000 < hotspot_info[0].percentage && core_num !=hotspot_info[0].ip_num)begin
|
if ( rnd1000 < hotspot_info[0].percentage && core_num !=hotspot_info[0].ip_num)begin
|
hotspot_flag=1;
|
hotspot_flag=1;
|
hotspot_node=hotspot_info[0].ip_num;
|
hotspot_node=hotspot_info[0].ip_num;
|
end else begin
|
end else begin
|
for (i=1;i
|
for (i=1;i
|
if (rnd1000 >= hotspot_info[i-1].percentage && rnd1000 < hotspot_info[i].percentage && core_num !=hotspot_info[i].ip_num) begin
|
if (rnd1000 >= hotspot_info[i-1].percentage && rnd1000 < hotspot_info[i].percentage && core_num !=hotspot_info[i].ip_num) begin
|
hotspot_flag=1;
|
hotspot_flag=1;
|
hotspot_node=hotspot_info[i].ip_num;
|
hotspot_node=hotspot_info[i].ip_num;
|
end
|
end
|
end end
|
end end
|
|
|
end
|
end
|
|
|
|
|
assign dest_ip_num = (off_flag)? core_num : (hotspot_flag)? hotspot_node : rnd_reg;
|
assign dest_ip_num = (off_flag)? core_num : (hotspot_flag)? hotspot_node : rnd_reg;
|
|
|
|
|
endmodule
|
endmodule
|
|
|