Files
OpenExSys_NoC/tb/v_test_generator.sv
2023-11-26 15:36:27 +01:00

728 lines
29 KiB
Systemverilog

module v_test_generator
import rvh_noc_pkg::*;
import v_noc_pkg::*;
#(
parameter SENDER_NUM = 1,
parameter LOCAL_PORT_SENDER_NUM = SENDER_NUM-4,
parameter RANDOM_BIT_NUM = 32, // 1 to 32, at least TEST_CASE_NUM_PER_CYCLE*3
parameter SCOREBOARD_TIMEOUT_EN = 1,
parameter SCOREBOARD_TIMEOUT_THRESHOLD = 64,
parameter TEST_CASE_NUM_PER_CYCLE = 1,
parameter TEST_CASE_SINGLE_ROUTER = 0, // assume the dut router posetion is (1,1)
// its adjacent routers are:
// sender0 (1,2)
// |
// sender3 (0,1) - (1,1) - (2,1) sender2
// | \
// sender1 (1,0) (local) sender4
parameter TEST_CASE_MESH_RANDOM = 0, // random sender and receiver
parameter TEST_CASE_MESH_DIAGONAL = 0, // from (0, 0) to (NODE_NUM_X_DIMESION-1, NODE_NUM_Y_DIMESION-1)
parameter TEST_CASE_MESH_BIT_COMPLEMENT = 0, // from (x, y) to (radix-x-1, radix-y-1)
parameter TEST_CASE_MESH_BIT_REVERSE = 0,
parameter TEST_CASE_MESH_BIT_ROTATION = 0,
parameter TEST_CASE_MESH_NEIGHBOR = 0,
parameter TEST_CASE_MESH_SHUFFLE = 0,
parameter TEST_CASE_MESH_TRANSPOSE = 0,
parameter TEST_CASE_MESH_TORNADO = 0,
parameter NODE_NUM_X_DIMESION = 2, // only used in TEST_CASE_MESH_* mode
parameter NODE_NUM_Y_DIMESION = 3, // only used in TEST_CASE_MESH_* mode
parameter LOCAL_PORT_NUM = 1, // only used in TEST_CASE_MESH_* mode
parameter ASSUMED_SYSTEM_FREQUENCY = (1<<30) // 1GHz
)
(
// intf with sender
output logic [SENDER_NUM-1:0] new_test_vld_o,
output test_case_t [SENDER_NUM-1:0] new_test_o,
input logic [SENDER_NUM-1:0] new_test_rdy_i,
// random seeds
input logic [RANDOM_BIT_NUM-1:0] src_id_lfsr_seed_i,
input logic [RANDOM_BIT_NUM-1:0] tgt_id_lfsr_seed_i,
input logic lfsr_update_en_i,
input logic [64-1:0] mcycle_i,
input logic clk,
input logic rstn
);
genvar i;
logic [RANDOM_BIT_NUM-1:0] src_id_lfsr_data;
logic [RANDOM_BIT_NUM-1:0] tgt_id_lfsr_data;
logic [TxnID_Width-1:0] txn_counter;
logic [TEST_CASE_NUM_PER_CYCLE-1:0] new_test_vld;
test_case_t [TEST_CASE_NUM_PER_CYCLE-1:0] new_test;
// map new test case to different sender
generate
if(TEST_CASE_SINGLE_ROUTER) begin: gen_map_test_case_single_router
always_comb begin
new_test_vld_o = '0;
new_test_o = '0;
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
unique case({new_test[i].flit_head.src_id.x_position, new_test[i].flit_head.src_id.y_position})
4'b0110: begin // sender0 (1,2)
new_test_vld_o[0] = new_test_vld[i];
new_test_o [0] = new_test[i];
end
4'b0100: begin // sender1 (1,0)
new_test_vld_o[1] = new_test_vld[i];
new_test_o [1] = new_test[i];
end
4'b1001: begin // sender2 (2,1)
new_test_vld_o[2] = new_test_vld[i];
new_test_o [2] = new_test[i];
end
4'b0001: begin // sender3 (0,1)
new_test_vld_o[3] = new_test_vld[i];
new_test_o [3] = new_test[i];
end
4'b0101: begin // sender4 (1,1)
new_test_vld_o[4+new_test[i].flit_head.src_id.device_port] = new_test_vld[i];
new_test_o [4+new_test[i].flit_head.src_id.device_port] = new_test[i];
end
default:begin
$fatal("test generator source id error");
end
endcase
end
end
end
else /*if(TEST_CASE_MESH_RANDOM || TEST_CASE_MESH_DIAGONAL)*/ begin: gen_map_test_case_mesh_x
// sender id = x_posotion*(NODE_NUM_Y_DIMESION*LOCAL_PORT_NUM) + y_posotion*LOCAL_PORT_NUM + local_port_id
always_comb begin
new_test_vld_o = '0;
new_test_o = '0;
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test_vld_o[new_test[i].flit_head.src_id.x_position*(NODE_NUM_Y_DIMESION*LOCAL_PORT_NUM) +
new_test[i].flit_head.src_id.y_position*LOCAL_PORT_NUM +
new_test[i].flit_head.src_id.device_port] = new_test_vld[i];
new_test_o [new_test[i].flit_head.src_id.x_position*(NODE_NUM_Y_DIMESION*LOCAL_PORT_NUM) +
new_test[i].flit_head.src_id.y_position*LOCAL_PORT_NUM +
new_test[i].flit_head.src_id.device_port] = new_test[i];
end
end
end
endgenerate
// generate new test case
generate
if(TEST_CASE_SINGLE_ROUTER) begin: gen_test_case_single_router
for(i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin: gen_new_test
always_comb begin
unique case(src_id_lfsr_data[i*3+:3])
3'b000: begin // from N
new_test[i].flit_head.src_id.x_position = 1;
new_test[i].flit_head.src_id.y_position = 2;
unique case(tgt_id_lfsr_data[i])
1'b0: begin // to S
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 0;
end
default: begin // to L
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 1;
end
endcase
end
3'b001: begin // from S
new_test[i].flit_head.src_id.x_position = 1;
new_test[i].flit_head.src_id.y_position = 0;
unique case(tgt_id_lfsr_data[i])
1'b0: begin // to N
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 2;
end
default: begin // to L
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 1;
end
endcase
end
3'b010: begin // from E
new_test[i].flit_head.src_id.x_position = 2;
new_test[i].flit_head.src_id.y_position = 1;
unique case(tgt_id_lfsr_data[i*2+:2])
2'b00: begin // to N
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 2;
end
2'b01: begin // to S
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 0;
end
2'b10: begin // to W
new_test[i].flit_head.tgt_id.x_position = 0;
new_test[i].flit_head.tgt_id.y_position = 1;
end
default: begin // to L
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 1;
end
endcase
end
3'b011: begin // from W
new_test[i].flit_head.src_id.x_position = 0;
new_test[i].flit_head.src_id.y_position = 1;
unique case(tgt_id_lfsr_data[i*2+:2])
2'b00: begin // to N
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 2;
end
2'b01: begin // to S
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 0;
end
2'b10: begin // to E
new_test[i].flit_head.tgt_id.x_position = 2;
new_test[i].flit_head.tgt_id.y_position = 1;
end
default: begin // to L
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 1;
end
endcase
end
default: begin // from L
new_test[i].flit_head.src_id.x_position = 1;
new_test[i].flit_head.src_id.y_position = 1;
unique case(tgt_id_lfsr_data[i*2+:2])
2'b00: begin // to N
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 2;
end
2'b01: begin // to S
new_test[i].flit_head.tgt_id.x_position = 1;
new_test[i].flit_head.tgt_id.y_position = 0;
end
2'b10: begin // to E
new_test[i].flit_head.tgt_id.x_position = 2;
new_test[i].flit_head.tgt_id.y_position = 1;
end
default: begin // to W
new_test[i].flit_head.tgt_id.x_position = 0;
new_test[i].flit_head.tgt_id.y_position = 1;
end
endcase
end
endcase
end
logic [FLIT_DATA_LENGTH-1:0] flit_data_mask;
always_comb begin
flit_data_mask = ~({RANDOM_BIT_NUM{1'b1}} << tgt_id_lfsr_data[$clog2(FLIT_DATA_LENGTH-RANDOM_BIT_NUM)-1:0]);
new_test[i].flit_data = '1;
new_test[i].flit_data = ((src_id_lfsr_data[RANDOM_BIT_NUM-1:0] ^ i) << tgt_id_lfsr_data[$clog2(FLIT_DATA_LENGTH-RANDOM_BIT_NUM)-1:0]) | flit_data_mask;
end
`ifdef ENABLE_TXN_ID
assign new_test[i].flit_head.txn_id = txn_counter + i;
`endif
assign new_test[i].timeout_threshold = SCOREBOARD_TIMEOUT_EN ? SCOREBOARD_TIMEOUT_THRESHOLD : '0; // 0 means no timeout error
assign new_test[i].mcycle_when_generated = mcycle_i;
logic [TEST_CASE_NUM_PER_CYCLE-1:0][2-1:0] random_device_port;
assign random_device_port[i] = src_id_lfsr_data[i*2+:2] ^ tgt_id_lfsr_data[i*2+:2];
always_comb begin
new_test[i].flit_head.src_id.device_port = '0;
new_test[i].flit_head.src_id.device_id = '0;
new_test[i].flit_head.tgt_id.device_port = '0;
new_test[i].flit_head.tgt_id.device_id = '0;
unique case(random_device_port[i]) // chooose which local port to route from/to(single router mode doesn't have local to local case)
2'd0: begin
new_test[i].flit_head.src_id.device_port = 0;
new_test[i].flit_head.tgt_id.device_port = 0;
end
`ifdef LOCAL_PORT_NUM_2
2'd1: begin
new_test[i].flit_head.src_id.device_port = 1;
new_test[i].flit_head.tgt_id.device_port = 1;
end
`endif
`ifdef LOCAL_PORT_NUM_3
2'd2: begin
if(LOCAL_PORT_SENDER_NUM >= 3) begin
new_test[i].flit_head.src_id.device_port = 2;
new_test[i].flit_head.tgt_id.device_port = 2;
end else begin
new_test[i].flit_head.src_id.device_port = 1;
new_test[i].flit_head.tgt_id.device_port = 1;
end
end
`endif
`ifdef LOCAL_PORT_NUM_4
2'd3: begin
new_test[i].flit_head.src_id.device_port = 3;
new_test[i].flit_head.tgt_id.device_port = 3;
end
`endif
default: begin
new_test[i].flit_head.src_id.device_port = 0;
new_test[i].flit_head.tgt_id.device_port = 0;
end
endcase
end
end
end else begin: gen_test_case_mesh
logic [FLIT_DATA_LENGTH-1:0] flit_data_mask;
assign flit_data_mask = ~({RANDOM_BIT_NUM{1'b1}} << tgt_id_lfsr_data[$clog2(FLIT_DATA_LENGTH-RANDOM_BIT_NUM)-1:0]);
logic [TEST_CASE_NUM_PER_CYCLE-1:0][$clog2(NODE_NUM_X_DIMESION*NODE_NUM_Y_DIMESION)-1:0] source_id;
logic [TEST_CASE_NUM_PER_CYCLE-1:0][$clog2(NODE_NUM_X_DIMESION*NODE_NUM_Y_DIMESION)-1:0] source_id_rev;
logic [TEST_CASE_NUM_PER_CYCLE-1:0][$clog2(NODE_NUM_X_DIMESION*NODE_NUM_Y_DIMESION)-1:0] dest_id;
for(genvar i_id = 0; i_id < TEST_CASE_NUM_PER_CYCLE; i_id++) begin
assign source_id[i_id] = new_test[i_id].flit_head.src_id.y_position * NODE_NUM_X_DIMESION + new_test[i_id].flit_head.src_id.x_position;
for(genvar j_id = 0; j_id < $clog2(NODE_NUM_X_DIMESION*NODE_NUM_Y_DIMESION); j_id++) begin
assign source_id_rev[i_id][j_id] = source_id[i_id][$clog2(NODE_NUM_X_DIMESION*NODE_NUM_Y_DIMESION)-1-j_id];
end
end
always_comb begin
// default values
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_data = '1;
new_test[i].flit_data = ((src_id_lfsr_data[RANDOM_BIT_NUM-1:0] ^ i) << tgt_id_lfsr_data[$clog2(FLIT_DATA_LENGTH-RANDOM_BIT_NUM)-1:0]) | flit_data_mask;
`ifdef ENABLE_TXN_ID
new_test[i].flit_head.txn_id = txn_counter + i;
`endif
`ifdef COMMON_QOS_EXTRA_RT_VC
new_test[i].timeout_threshold = //(new_test[i].qos_value == '1) ? 2 * (NODE_NUM_X_DIMESION + NODE_NUM_Y_DIMESION - 1) :
SCOREBOARD_TIMEOUT_EN ? SCOREBOARD_TIMEOUT_THRESHOLD : '0;
`else
new_test[i].timeout_threshold = SCOREBOARD_TIMEOUT_EN ? SCOREBOARD_TIMEOUT_THRESHOLD : '0;
`endif
new_test[i].mcycle_when_generated = mcycle_i;
new_test[i].flit_head.src_id.device_id = '0;
new_test[i].flit_head.tgt_id.device_id = '0;
new_test[i].flit_head.src_id.device_port = (src_id_lfsr_data[i*2+:2] ^ tgt_id_lfsr_data[RANDOM_BIT_NUM-1-i*2-:2]) % LOCAL_PORT_NUM;
new_test[i].flit_head.tgt_id.device_port = (src_id_lfsr_data[RANDOM_BIT_NUM-1-i*2-:2] ^ tgt_id_lfsr_data[i*2+:2]) % LOCAL_PORT_NUM;
dest_id[i] = '0;
end
if(TEST_CASE_MESH_RANDOM) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = src_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.src_id.y_position = src_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
new_test[i].flit_head.tgt_id.x_position = tgt_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.tgt_id.y_position = tgt_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
end
end else if(TEST_CASE_MESH_DIAGONAL) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = 0;
new_test[i].flit_head.src_id.y_position = 0;
new_test[i].flit_head.tgt_id.x_position = NODE_NUM_X_DIMESION - 1;
new_test[i].flit_head.tgt_id.y_position = NODE_NUM_Y_DIMESION - 1;
new_test[i].timeout_threshold = SCOREBOARD_TIMEOUT_EN ? SCOREBOARD_TIMEOUT_THRESHOLD : '0;
new_test[i].flit_head.src_id.device_id = '0;
new_test[i].flit_head.tgt_id.device_id = '0;
new_test[i].flit_head.src_id.device_port = 0;
new_test[i].flit_head.tgt_id.device_port = 0;
end
end else if (TEST_CASE_MESH_BIT_COMPLEMENT) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = src_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.src_id.y_position = src_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
new_test[i].flit_head.tgt_id.x_position = NODE_NUM_X_DIMESION-1-new_test[i].flit_head.src_id.x_position;
new_test[i].flit_head.tgt_id.y_position = NODE_NUM_Y_DIMESION-1-new_test[i].flit_head.src_id.y_position;
end
end else if (TEST_CASE_MESH_BIT_REVERSE) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = src_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.src_id.y_position = src_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
new_test[i].flit_head.tgt_id.x_position = source_id_rev % NODE_NUM_X_DIMESION;
new_test[i].flit_head.tgt_id.y_position = (source_id_rev / NODE_NUM_X_DIMESION) % NODE_NUM_Y_DIMESION;
end
end else if (TEST_CASE_MESH_BIT_ROTATION) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = src_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.src_id.y_position = src_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
new_test[i].flit_head.tgt_id.x_position = new_test[i].flit_head.src_id.x_position > 0 ? new_test[i].flit_head.src_id.x_position - 1:
new_test[i].flit_head.src_id.y_position > 0 ? NODE_NUM_X_DIMESION-1:
new_test[i].flit_head.src_id.x_position;
new_test[i].flit_head.tgt_id.y_position = new_test[i].flit_head.src_id.x_position > 0 ? new_test[i].flit_head.src_id.y_position :
new_test[i].flit_head.src_id.y_position > 0 ? new_test[i].flit_head.src_id.y_position - 1:
new_test[i].flit_head.src_id.y_position;
end
end else if (TEST_CASE_MESH_NEIGHBOR) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = src_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.src_id.y_position = src_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
new_test[i].flit_head.tgt_id.x_position = (new_test[i].flit_head.src_id.x_position + 1) % NODE_NUM_X_DIMESION;
new_test[i].flit_head.tgt_id.y_position = new_test[i].flit_head.src_id.y_position ;
end
end else if (TEST_CASE_MESH_SHUFFLE) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = src_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.src_id.y_position = src_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
if(source_id[i] < (NODE_NUM_X_DIMESION*NODE_NUM_Y_DIMESION)/2) begin
dest_id[i] = source_id[i] * 2;
end else begin
dest_id[i] = (source_id[i] *2) - (NODE_NUM_X_DIMESION*NODE_NUM_Y_DIMESION) + 1;
end
new_test[i].flit_head.tgt_id.x_position = dest_id % NODE_NUM_X_DIMESION;
new_test[i].flit_head.tgt_id.y_position = (dest_id / NODE_NUM_X_DIMESION) % NODE_NUM_Y_DIMESION;
end
end else if (TEST_CASE_MESH_TRANSPOSE) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = src_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.src_id.y_position = src_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
new_test[i].flit_head.tgt_id.x_position = new_test[i].flit_head.src_id.y_position % NODE_NUM_X_DIMESION;
new_test[i].flit_head.tgt_id.y_position = new_test[i].flit_head.src_id.x_position % NODE_NUM_Y_DIMESION;
end
end else if (TEST_CASE_MESH_TORNADO) begin
for(int i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin
new_test[i].flit_head.src_id.x_position = src_id_lfsr_data[i*3+:3] % NODE_NUM_X_DIMESION;
new_test[i].flit_head.src_id.y_position = src_id_lfsr_data[RANDOM_BIT_NUM-1-i*3-:3] % NODE_NUM_Y_DIMESION;
new_test[i].flit_head.tgt_id.x_position = (new_test[i].flit_head.src_id.x_position + int'($ceil(NODE_NUM_X_DIMESION*1.0/2)) - 1) % NODE_NUM_X_DIMESION;
new_test[i].flit_head.tgt_id.y_position = new_test[i].flit_head.src_id.y_position;
end
end
end
end
endgenerate
generate
if(TEST_CASE_SINGLE_ROUTER) begin: gen_test_case_look_ahead_routing_single_router // the dut router is assume to be (1,1)
for(i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin: gen_new_test_look_ahead_routing
always_comb begin
if(new_test[i].flit_head.tgt_id.x_position > 1) begin
new_test[i].flit_head.look_ahead_routing = E;
end else if(new_test[i].flit_head.tgt_id.x_position < 1) begin
new_test[i].flit_head.look_ahead_routing = W;
end else if(new_test[i].flit_head.tgt_id.y_position > 1) begin
new_test[i].flit_head.look_ahead_routing = N;
end else if(new_test[i].flit_head.tgt_id.y_position < 1) begin
new_test[i].flit_head.look_ahead_routing = S;
end else begin
unique case(new_test[i].flit_head.tgt_id.device_port) // chooose which local port to route to
0: begin
new_test[i].flit_head.look_ahead_routing = L0;
end
`ifdef LOCAL_PORT_NUM_2
1: begin
new_test[i].flit_head.look_ahead_routing = L1;
end
`endif
`ifdef LOCAL_PORT_NUM_3
2: begin
new_test[i].flit_head.look_ahead_routing = L2;
end
`endif
`ifdef LOCAL_PORT_NUM_4
3: begin
new_test[i].flit_head.look_ahead_routing = L3;
end
`endif
default: begin
new_test[i].flit_head.look_ahead_routing = L0;
end
endcase
end
end
end
end
else /*if(TEST_CASE_MESH_RANDOM || TEST_CASE_MESH_DIAGONAL)*/ begin: gen_test_case_look_ahead_routing_mesh_x
for(i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin: gen_new_test_look_ahead_routing
always_comb begin
if(new_test[i].flit_head.tgt_id.x_position > new_test[i].flit_head.src_id.x_position) begin
new_test[i].flit_head.look_ahead_routing = E;
end else if(new_test[i].flit_head.tgt_id.x_position < new_test[i].flit_head.src_id.x_position) begin
new_test[i].flit_head.look_ahead_routing = W;
end else if(new_test[i].flit_head.tgt_id.y_position > new_test[i].flit_head.src_id.y_position) begin
new_test[i].flit_head.look_ahead_routing = N;
end else if(new_test[i].flit_head.tgt_id.y_position < new_test[i].flit_head.src_id.y_position) begin
new_test[i].flit_head.look_ahead_routing = S;
end else begin
unique case(new_test[i].flit_head.tgt_id.device_port) // chooose which local port to route to
0: begin
new_test[i].flit_head.look_ahead_routing = L0;
end
`ifdef LOCAL_PORT_NUM_2
1: begin
new_test[i].flit_head.look_ahead_routing = L1;
end
`endif
`ifdef LOCAL_PORT_NUM_3
2: begin
new_test[i].flit_head.look_ahead_routing = L2;
end
`endif
`ifdef LOCAL_PORT_NUM_4
3: begin
new_test[i].flit_head.look_ahead_routing = L3;
end
`endif
default: begin
new_test[i].flit_head.look_ahead_routing = L0;
end
endcase
end
end
end
end
endgenerate
logic [TEST_CASE_NUM_PER_CYCLE-1:0][3-1:0] random_qos;
generate
for(i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin: gen_new_test_qos_value
assign random_qos[i] = src_id_lfsr_data[i*3+:3] ^~ tgt_id_lfsr_data[i*3+:3];
`ifdef USE_QOS_VALUE
always_comb begin
unique case(random_qos[i])
0, 1: begin
new_test[i].qos_value = 4;
new_test[i].flit_head.qos_value = 4;
end
2, 3: begin
new_test[i].qos_value = 8;
new_test[i].flit_head.qos_value = 8;
end
4: begin
new_test[i].qos_value = 15;
new_test[i].flit_head.qos_value = 15;
end
default: begin
new_test[i].qos_value = '0;
new_test[i].flit_head.qos_value = '0;
end
endcase
// if((new_test[i].flit_head.src_id.x_position == 0) &&
// (new_test[i].flit_head.src_id.y_position == 0) &&
// (new_test[i].flit_head.src_id.device_port == 0)) begin
// new_test[i].qos_value = '1;
// new_test[i].flit_head.qos_value = '1;
// end
end
`else
assign new_test[i].qos_value = '0;
`endif
end
endgenerate
generate
for(i = 0; i < TEST_CASE_NUM_PER_CYCLE; i++) begin: gen_new_test_vld
`ifdef ALLOW_SAME_ROUTER_L2L_TRANSFER
assign new_test_vld[i] = ~((new_test[i].flit_head.src_id.x_position == new_test[i].flit_head.tgt_id.x_position) &&
(new_test[i].flit_head.src_id.y_position == new_test[i].flit_head.tgt_id.y_position) &&
(new_test[i].flit_head.src_id.device_port == new_test[i].flit_head.tgt_id.device_port)
);
`else
assign new_test_vld[i] = (new_test[i].flit_head.src_id.x_position != new_test[i].flit_head.tgt_id.x_position) |
(new_test[i].flit_head.src_id.y_position != new_test[i].flit_head.tgt_id.y_position);
`endif
end
endgenerate
LFSR #(.NUM_BITS(RANDOM_BIT_NUM)) src_id_gen_u (
.i_Clk (clk),
.i_Enable (rstn),
.i_Seed_DV (lfsr_update_en_i ),
.i_Seed_Data (src_id_lfsr_seed_i),
.o_LFSR_Data (src_id_lfsr_data),
.o_LFSR_Done ()
);
LFSR #(.NUM_BITS(RANDOM_BIT_NUM)) tgt_id_gen_u (
.i_Clk (clk),
.i_Enable (rstn),
.i_Seed_DV (lfsr_update_en_i ),
.i_Seed_Data (tgt_id_lfsr_seed_i),
.o_LFSR_Data (tgt_id_lfsr_data),
.o_LFSR_Done ()
);
always_ff @(posedge clk or negedge rstn ) begin
if(~rstn) begin
txn_counter <= '0;
end else if(|new_test_vld) begin
txn_counter <= txn_counter + TEST_CASE_NUM_PER_CYCLE;
end
end
// display app throughput
logic [SENDER_NUM-1:0][64-1:0] flit_num_counter_d, flit_num_counter_q; // sent
logic [SENDER_NUM-1:0] flit_num_counter_ena;
logic [64-1:0] flit_num_counter_all_d, flit_num_counter_all_q;
logic flit_num_counter_all_ena;
logic [SENDER_NUM-1:0][64-1:0] flit_num_gened_counter_d, flit_num_gened_counter_q; // generated, no matter whether it is sent
logic [SENDER_NUM-1:0] flit_num_gened_counter_ena;
logic [64-1:0] flit_num_gened_counter_all_d, flit_num_gened_counter_all_q;
logic flit_num_gened_counter_all_ena;
generate
for(i = 0; i < SENDER_NUM; i++) begin: gen_flit_num_counter_q
std_dffre
#(.WIDTH(64))
U_DAT_FLIT_NUM_COUNTER
(
.clk(clk),
.rstn(rstn),
.en(flit_num_counter_ena[i]),
.d (flit_num_counter_d [i]),
.q (flit_num_counter_q [i])
);
end
endgenerate
std_dffre
#(.WIDTH(64))
U_DAT_FLIT_NUM_ALL_COUNTER
(
.clk(clk),
.rstn(rstn),
.en(flit_num_counter_all_ena),
.d (flit_num_counter_all_d ),
.q (flit_num_counter_all_q )
);
generate
for(i = 0; i < SENDER_NUM; i++) begin: gen_flit_gened_num_counter_q
std_dffre
#(.WIDTH(64))
U_DAT_FLIT_GENED_NUM_COUNTER
(
.clk(clk),
.rstn(rstn),
.en(flit_num_gened_counter_ena[i]),
.d (flit_num_gened_counter_d [i]),
.q (flit_num_gened_counter_q [i])
);
end
endgenerate
std_dffre
#(.WIDTH(64))
U_DAT_FLIT_GENED_NUM_ALL_COUNTER
(
.clk(clk),
.rstn(rstn),
.en(flit_num_gened_counter_all_ena),
.d (flit_num_gened_counter_all_d ),
.q (flit_num_gened_counter_all_q )
);
real flit_num_counter[SENDER_NUM-1:0];
real flit_num_counter_all;
real flit_num_gened_counter[SENDER_NUM-1:0];
real flit_num_gened_counter_all;
real mcycle;
always_ff @(posedge clk) begin
flit_num_counter_all_d = flit_num_counter_all_q;
flit_num_counter_all_ena = 1'b0;
flit_num_gened_counter_all_d = flit_num_gened_counter_all_q;
flit_num_gened_counter_all_ena = 1'b0;
mcycle = mcycle_i;
flit_num_counter_all = flit_num_counter_all_q;
flit_num_gened_counter_all = flit_num_gened_counter_all_q;
for(int i = 0; i < SENDER_NUM; i++) begin
flit_num_counter_d [i] = flit_num_counter_q[i];
flit_num_counter_ena[i] = 1'b0;
flit_num_gened_counter_d [i] = flit_num_gened_counter_q[i];
flit_num_gened_counter_ena[i] = 1'b0;
flit_num_counter[i] = flit_num_counter_q[i];
flit_num_gened_counter[i] = flit_num_gened_counter_q[i];
if(new_test_vld_o[i]) begin
flit_num_gened_counter_d [i] = flit_num_gened_counter_q[i] + 1;
flit_num_gened_counter_ena[i] = 1'b1;
flit_num_gened_counter_all_d = flit_num_gened_counter_all_d + 1;
flit_num_gened_counter_all_ena = 1'b1;
if(new_test_rdy_i[i]) begin
$display("[%16d] info: test_generator gen case to sender: %2d, [average_app_gen_bandwidth: %fGBps], [average_app_bandwidth: %fGBps]",
$time(), i,
((flit_num_gened_counter[i] * FLIT_LENGTH /8/1024/1024/1024) / (mcycle / ASSUMED_SYSTEM_FREQUENCY)),
((flit_num_counter[i] * FLIT_LENGTH /8/1024/1024/1024) / (mcycle / ASSUMED_SYSTEM_FREQUENCY)));
flit_num_counter_d [i] = flit_num_counter_q[i] + 1;
flit_num_counter_ena[i] = 1'b1;
flit_num_counter_all_d = flit_num_counter_all_d + 1;
flit_num_counter_all_ena = 1'b1;
end
end
end
if(|(new_test_vld_o & new_test_rdy_i)) begin
$display("[%16d] info: test_generator gen case to sender:all, [average_app_gen_bandwidth: %fGBps], [average_app_bandwidth: %fGBps]",
$time(),
((flit_num_gened_counter_all * FLIT_LENGTH /8/1024/1024/1024) / (mcycle / ASSUMED_SYSTEM_FREQUENCY)),
((flit_num_counter_all * FLIT_LENGTH /8/1024/1024/1024) / (mcycle / ASSUMED_SYSTEM_FREQUENCY)));
end
end
endmodule