mirror of
https://github.com/corundum/corundum.git
synced 2025-01-30 08:32:52 +08:00
Parametrize tag and counter widths
This commit is contained in:
parent
0c3af7d5bb
commit
b07c2d63b0
@ -101,7 +101,8 @@ THE SOFTWARE.
|
|||||||
*/
|
*/
|
||||||
module {{name}} #
|
module {{name}} #
|
||||||
(
|
(
|
||||||
parameter ENABLE_TAG = 1
|
parameter TAG_ENABLE = 1,
|
||||||
|
parameter TAG_WIDTH = 16
|
||||||
)
|
)
|
||||||
(
|
(
|
||||||
input wire clk,
|
input wire clk,
|
||||||
@ -129,7 +130,7 @@ module {{name}} #
|
|||||||
/*
|
/*
|
||||||
* Configuration
|
* Configuration
|
||||||
*/
|
*/
|
||||||
input wire [15:0] tag,
|
input wire [TAG_WIDTH-1:0] tag,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Status signals
|
* Status signals
|
||||||
@ -137,6 +138,8 @@ module {{name}} #
|
|||||||
output wire busy
|
output wire busy
|
||||||
);
|
);
|
||||||
|
|
||||||
|
localparam TAG_BYTE_WIDTH = (TAG_WIDTH + 7) / 8;
|
||||||
|
|
||||||
// state register
|
// state register
|
||||||
localparam [1:0]
|
localparam [1:0]
|
||||||
STATE_IDLE = 2'd0,
|
STATE_IDLE = 2'd0,
|
||||||
@ -187,6 +190,8 @@ always @* begin
|
|||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
|
integer offset, i;
|
||||||
|
|
||||||
always @* begin
|
always @* begin
|
||||||
state_next = 2'bz;
|
state_next = 2'bz;
|
||||||
|
|
||||||
@ -210,7 +215,7 @@ always @* begin
|
|||||||
port_sel_next = 0;
|
port_sel_next = 0;
|
||||||
output_tuser_next = 0;
|
output_tuser_next = 0;
|
||||||
|
|
||||||
if (ENABLE_TAG) begin
|
if (TAG_ENABLE) begin
|
||||||
// next cycle if started will send tag, so do not enable input
|
// next cycle if started will send tag, so do not enable input
|
||||||
input_0_axis_tready_next = 0;
|
input_0_axis_tready_next = 0;
|
||||||
end else begin
|
end else begin
|
||||||
@ -220,15 +225,14 @@ always @* begin
|
|||||||
|
|
||||||
if (input_0_axis_tvalid) begin
|
if (input_0_axis_tvalid) begin
|
||||||
// input 0 valid; start transferring data
|
// input 0 valid; start transferring data
|
||||||
if (ENABLE_TAG) begin
|
if (TAG_ENABLE) begin
|
||||||
// tag enabled, so transmit it
|
// tag enabled, so transmit it
|
||||||
if (output_axis_tready_int) begin
|
if (output_axis_tready_int) begin
|
||||||
// output is ready, so short-circuit first tag byte
|
// output is ready, so short-circuit first tag byte
|
||||||
frame_ptr_next = 1;
|
frame_ptr_next = 1;
|
||||||
output_axis_tdata_int = tag[15:8];
|
output_axis_tdata_int = tag[(TAG_BYTE_WIDTH-1)*8 +: 8];
|
||||||
output_axis_tvalid_int = 1;
|
output_axis_tvalid_int = 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
state_next = STATE_WRITE_TAG;
|
state_next = STATE_WRITE_TAG;
|
||||||
end else begin
|
end else begin
|
||||||
// tag disabled, so transmit data
|
// tag disabled, so transmit data
|
||||||
@ -250,15 +254,20 @@ always @* begin
|
|||||||
state_next = STATE_WRITE_TAG;
|
state_next = STATE_WRITE_TAG;
|
||||||
frame_ptr_next = frame_ptr_reg + 1;
|
frame_ptr_next = frame_ptr_reg + 1;
|
||||||
output_axis_tvalid_int = 1;
|
output_axis_tvalid_int = 1;
|
||||||
case (frame_ptr_reg)
|
|
||||||
2'd0: output_axis_tdata_int = tag[15:8];
|
offset = 0;
|
||||||
2'd1: begin
|
if (TAG_ENABLE) begin
|
||||||
// last tag byte - get ready to send data, enable input if ready
|
for (i = TAG_BYTE_WIDTH-1; i >= 0; i = i - 1) begin
|
||||||
output_axis_tdata_int = tag[7:0];
|
if (frame_ptr_reg == offset) begin
|
||||||
|
output_axis_tdata_int = tag[i*8 +: 8];
|
||||||
|
end
|
||||||
|
offset = offset + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (frame_ptr_reg == offset-1) begin
|
||||||
input_0_axis_tready_next = output_axis_tready_int_early;
|
input_0_axis_tready_next = output_axis_tready_int_early;
|
||||||
state_next = STATE_TRANSFER;
|
state_next = STATE_TRANSFER;
|
||||||
end
|
end
|
||||||
endcase
|
|
||||||
end else begin
|
end else begin
|
||||||
state_next = STATE_WRITE_TAG;
|
state_next = STATE_WRITE_TAG;
|
||||||
end
|
end
|
||||||
|
@ -31,7 +31,8 @@ THE SOFTWARE.
|
|||||||
*/
|
*/
|
||||||
module axis_frame_join_4 #
|
module axis_frame_join_4 #
|
||||||
(
|
(
|
||||||
parameter ENABLE_TAG = 1
|
parameter TAG_ENABLE = 1,
|
||||||
|
parameter TAG_WIDTH = 16
|
||||||
)
|
)
|
||||||
(
|
(
|
||||||
input wire clk,
|
input wire clk,
|
||||||
@ -76,7 +77,7 @@ module axis_frame_join_4 #
|
|||||||
/*
|
/*
|
||||||
* Configuration
|
* Configuration
|
||||||
*/
|
*/
|
||||||
input wire [15:0] tag,
|
input wire [TAG_WIDTH-1:0] tag,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Status signals
|
* Status signals
|
||||||
@ -84,6 +85,8 @@ module axis_frame_join_4 #
|
|||||||
output wire busy
|
output wire busy
|
||||||
);
|
);
|
||||||
|
|
||||||
|
localparam TAG_BYTE_WIDTH = (TAG_WIDTH + 7) / 8;
|
||||||
|
|
||||||
// state register
|
// state register
|
||||||
localparam [1:0]
|
localparam [1:0]
|
||||||
STATE_IDLE = 2'd0,
|
STATE_IDLE = 2'd0,
|
||||||
@ -154,6 +157,8 @@ always @* begin
|
|||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
|
integer offset, i;
|
||||||
|
|
||||||
always @* begin
|
always @* begin
|
||||||
state_next = 2'bz;
|
state_next = 2'bz;
|
||||||
|
|
||||||
@ -179,7 +184,7 @@ always @* begin
|
|||||||
port_sel_next = 0;
|
port_sel_next = 0;
|
||||||
output_tuser_next = 0;
|
output_tuser_next = 0;
|
||||||
|
|
||||||
if (ENABLE_TAG) begin
|
if (TAG_ENABLE) begin
|
||||||
// next cycle if started will send tag, so do not enable input
|
// next cycle if started will send tag, so do not enable input
|
||||||
input_0_axis_tready_next = 0;
|
input_0_axis_tready_next = 0;
|
||||||
end else begin
|
end else begin
|
||||||
@ -189,15 +194,14 @@ always @* begin
|
|||||||
|
|
||||||
if (input_0_axis_tvalid) begin
|
if (input_0_axis_tvalid) begin
|
||||||
// input 0 valid; start transferring data
|
// input 0 valid; start transferring data
|
||||||
if (ENABLE_TAG) begin
|
if (TAG_ENABLE) begin
|
||||||
// tag enabled, so transmit it
|
// tag enabled, so transmit it
|
||||||
if (output_axis_tready_int) begin
|
if (output_axis_tready_int) begin
|
||||||
// output is ready, so short-circuit first tag byte
|
// output is ready, so short-circuit first tag byte
|
||||||
frame_ptr_next = 1;
|
frame_ptr_next = 1;
|
||||||
output_axis_tdata_int = tag[15:8];
|
output_axis_tdata_int = tag[(TAG_BYTE_WIDTH-1)*8 +: 8];
|
||||||
output_axis_tvalid_int = 1;
|
output_axis_tvalid_int = 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
state_next = STATE_WRITE_TAG;
|
state_next = STATE_WRITE_TAG;
|
||||||
end else begin
|
end else begin
|
||||||
// tag disabled, so transmit data
|
// tag disabled, so transmit data
|
||||||
@ -219,15 +223,20 @@ always @* begin
|
|||||||
state_next = STATE_WRITE_TAG;
|
state_next = STATE_WRITE_TAG;
|
||||||
frame_ptr_next = frame_ptr_reg + 1;
|
frame_ptr_next = frame_ptr_reg + 1;
|
||||||
output_axis_tvalid_int = 1;
|
output_axis_tvalid_int = 1;
|
||||||
case (frame_ptr_reg)
|
|
||||||
2'd0: output_axis_tdata_int = tag[15:8];
|
offset = 0;
|
||||||
2'd1: begin
|
if (TAG_ENABLE) begin
|
||||||
// last tag byte - get ready to send data, enable input if ready
|
for (i = TAG_BYTE_WIDTH-1; i >= 0; i = i - 1) begin
|
||||||
output_axis_tdata_int = tag[7:0];
|
if (frame_ptr_reg == offset) begin
|
||||||
|
output_axis_tdata_int = tag[i*8 +: 8];
|
||||||
|
end
|
||||||
|
offset = offset + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (frame_ptr_reg == offset-1) begin
|
||||||
input_0_axis_tready_next = output_axis_tready_int_early;
|
input_0_axis_tready_next = output_axis_tready_int_early;
|
||||||
state_next = STATE_TRANSFER;
|
state_next = STATE_TRANSFER;
|
||||||
end
|
end
|
||||||
endcase
|
|
||||||
end else begin
|
end else begin
|
||||||
state_next = STATE_WRITE_TAG;
|
state_next = STATE_WRITE_TAG;
|
||||||
end
|
end
|
||||||
|
@ -32,7 +32,15 @@ THE SOFTWARE.
|
|||||||
module axis_stat_counter #
|
module axis_stat_counter #
|
||||||
(
|
(
|
||||||
parameter DATA_WIDTH = 64,
|
parameter DATA_WIDTH = 64,
|
||||||
parameter KEEP_WIDTH = (DATA_WIDTH/8)
|
parameter KEEP_WIDTH = (DATA_WIDTH/8),
|
||||||
|
parameter TAG_ENABLE = 1,
|
||||||
|
parameter TAG_WIDTH = 16,
|
||||||
|
parameter TICK_COUNT_ENABLE = 1,
|
||||||
|
parameter TICK_COUNT_WIDTH = 32,
|
||||||
|
parameter BYTE_COUNT_ENABLE = 1,
|
||||||
|
parameter BYTE_COUNT_WIDTH = 32,
|
||||||
|
parameter FRAME_COUNT_ENABLE = 1,
|
||||||
|
parameter FRAME_COUNT_WIDTH = 32
|
||||||
)
|
)
|
||||||
(
|
(
|
||||||
input wire clk,
|
input wire clk,
|
||||||
@ -58,7 +66,7 @@ module axis_stat_counter #
|
|||||||
/*
|
/*
|
||||||
* Configuration
|
* Configuration
|
||||||
*/
|
*/
|
||||||
input wire [15:0] tag,
|
input wire [TAG_WIDTH-1:0] tag,
|
||||||
input wire trigger,
|
input wire trigger,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -67,6 +75,12 @@ module axis_stat_counter #
|
|||||||
output wire busy
|
output wire busy
|
||||||
);
|
);
|
||||||
|
|
||||||
|
localparam TAG_BYTE_WIDTH = (TAG_WIDTH + 7) / 8;
|
||||||
|
localparam TICK_COUNT_BYTE_WIDTH = (TICK_COUNT_WIDTH + 7) / 8;
|
||||||
|
localparam BYTE_COUNT_BYTE_WIDTH = (BYTE_COUNT_WIDTH + 7) / 8;
|
||||||
|
localparam FRAME_COUNT_BYTE_WIDTH = (FRAME_COUNT_WIDTH + 7) / 8;
|
||||||
|
localparam TOTAL_LENGTH = TAG_BYTE_WIDTH + TICK_COUNT_BYTE_WIDTH + BYTE_COUNT_BYTE_WIDTH + FRAME_COUNT_BYTE_WIDTH;
|
||||||
|
|
||||||
// state register
|
// state register
|
||||||
localparam [1:0]
|
localparam [1:0]
|
||||||
STATE_IDLE = 2'd0,
|
STATE_IDLE = 2'd0,
|
||||||
@ -74,17 +88,17 @@ localparam [1:0]
|
|||||||
|
|
||||||
reg [1:0] state_reg = STATE_IDLE, state_next;
|
reg [1:0] state_reg = STATE_IDLE, state_next;
|
||||||
|
|
||||||
reg [31:0] tick_count_reg = 0, tick_count_next;
|
reg [TICK_COUNT_WIDTH-1:0] tick_count_reg = 0, tick_count_next;
|
||||||
reg [31:0] byte_count_reg = 0, byte_count_next;
|
reg [BYTE_COUNT_WIDTH-1:0] byte_count_reg = 0, byte_count_next;
|
||||||
reg [31:0] frame_count_reg = 0, frame_count_next;
|
reg [FRAME_COUNT_WIDTH-1:0] frame_count_reg = 0, frame_count_next;
|
||||||
reg frame_reg = 0, frame_next;
|
reg frame_reg = 0, frame_next;
|
||||||
|
|
||||||
reg store_output;
|
reg store_output;
|
||||||
reg [5:0] frame_ptr_reg = 0, frame_ptr_next;
|
reg [$clog2(TOTAL_LENGTH)-1:0] frame_ptr_reg = 0, frame_ptr_next;
|
||||||
|
|
||||||
reg [31:0] tick_count_output_reg = 0;
|
reg [TICK_COUNT_WIDTH-1:0] tick_count_output_reg = 0;
|
||||||
reg [31:0] byte_count_output_reg = 0;
|
reg [BYTE_COUNT_WIDTH-1:0] byte_count_output_reg = 0;
|
||||||
reg [31:0] frame_count_output_reg = 0;
|
reg [FRAME_COUNT_WIDTH-1:0] frame_count_output_reg = 0;
|
||||||
|
|
||||||
reg busy_reg = 0;
|
reg busy_reg = 0;
|
||||||
|
|
||||||
@ -98,35 +112,7 @@ wire output_axis_tready_int_early;
|
|||||||
|
|
||||||
assign busy = busy_reg;
|
assign busy = busy_reg;
|
||||||
|
|
||||||
function [3:0] keep2count;
|
integer offset, i, bit_cnt;
|
||||||
input [7:0] k;
|
|
||||||
case (k)
|
|
||||||
8'b00000000: keep2count = 0;
|
|
||||||
8'b00000001: keep2count = 1;
|
|
||||||
8'b00000011: keep2count = 2;
|
|
||||||
8'b00000111: keep2count = 3;
|
|
||||||
8'b00001111: keep2count = 4;
|
|
||||||
8'b00011111: keep2count = 5;
|
|
||||||
8'b00111111: keep2count = 6;
|
|
||||||
8'b01111111: keep2count = 7;
|
|
||||||
8'b11111111: keep2count = 8;
|
|
||||||
endcase
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function [7:0] count2keep;
|
|
||||||
input [3:0] k;
|
|
||||||
case (k)
|
|
||||||
4'd0: count2keep = 8'b00000000;
|
|
||||||
4'd1: count2keep = 8'b00000001;
|
|
||||||
4'd2: count2keep = 8'b00000011;
|
|
||||||
4'd3: count2keep = 8'b00000111;
|
|
||||||
4'd4: count2keep = 8'b00001111;
|
|
||||||
4'd5: count2keep = 8'b00011111;
|
|
||||||
4'd6: count2keep = 8'b00111111;
|
|
||||||
4'd7: count2keep = 8'b01111111;
|
|
||||||
4'd8: count2keep = 8'b11111111;
|
|
||||||
endcase
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
always @* begin
|
always @* begin
|
||||||
state_next = 2'bz;
|
state_next = 2'bz;
|
||||||
@ -158,7 +144,15 @@ always @* begin
|
|||||||
|
|
||||||
if (output_axis_tready_int) begin
|
if (output_axis_tready_int) begin
|
||||||
frame_ptr_next = 1;
|
frame_ptr_next = 1;
|
||||||
output_axis_tdata_int = tag[15:8];
|
if (TAG_ENABLE) begin
|
||||||
|
output_axis_tdata_int = tag[(TAG_BYTE_WIDTH-1)*8 +: 8];
|
||||||
|
end else if (TICK_COUNT_ENABLE) begin
|
||||||
|
output_axis_tdata_int = tag[(TICK_COUNT_BYTE_WIDTH-1)*8 +: 8];
|
||||||
|
end else if (BYTE_COUNT_ENABLE) begin
|
||||||
|
output_axis_tdata_int = tag[(BYTE_COUNT_BYTE_WIDTH-1)*8 +: 8];
|
||||||
|
end else if (FRAME_COUNT_ENABLE) begin
|
||||||
|
output_axis_tdata_int = tag[(FRAME_COUNT_BYTE_WIDTH-1)*8 +: 8];
|
||||||
|
end
|
||||||
output_axis_tvalid_int = 1;
|
output_axis_tvalid_int = 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -172,26 +166,44 @@ always @* begin
|
|||||||
state_next = STATE_OUTPUT_DATA;
|
state_next = STATE_OUTPUT_DATA;
|
||||||
frame_ptr_next = frame_ptr_reg + 1;
|
frame_ptr_next = frame_ptr_reg + 1;
|
||||||
output_axis_tvalid_int = 1;
|
output_axis_tvalid_int = 1;
|
||||||
case (frame_ptr_reg)
|
|
||||||
5'd00: output_axis_tdata_int = tag[15:8];
|
offset = 0;
|
||||||
5'd01: output_axis_tdata_int = tag[7:0];
|
if (TAG_ENABLE) begin
|
||||||
5'd02: output_axis_tdata_int = tick_count_output_reg[31:24];
|
for (i = TAG_BYTE_WIDTH-1; i >= 0; i = i - 1) begin
|
||||||
5'd03: output_axis_tdata_int = tick_count_output_reg[23:16];
|
if (frame_ptr_reg == offset) begin
|
||||||
5'd04: output_axis_tdata_int = tick_count_output_reg[15: 8];
|
output_axis_tdata_int = tag[i*8 +: 8];
|
||||||
5'd05: output_axis_tdata_int = tick_count_output_reg[ 7: 0];
|
end
|
||||||
5'd06: output_axis_tdata_int = byte_count_output_reg[31:24];
|
offset = offset + 1;
|
||||||
5'd07: output_axis_tdata_int = byte_count_output_reg[23:16];
|
end
|
||||||
5'd08: output_axis_tdata_int = byte_count_output_reg[15: 8];
|
end
|
||||||
5'd09: output_axis_tdata_int = byte_count_output_reg[ 7: 0];
|
if (TICK_COUNT_ENABLE) begin
|
||||||
5'd10: output_axis_tdata_int = frame_count_output_reg[31:24];
|
for (i = TICK_COUNT_BYTE_WIDTH-1; i >= 0; i = i - 1) begin
|
||||||
5'd11: output_axis_tdata_int = frame_count_output_reg[23:16];
|
if (frame_ptr_reg == offset) begin
|
||||||
5'd12: output_axis_tdata_int = frame_count_output_reg[15: 8];
|
output_axis_tdata_int = tick_count_output_reg[i*8 +: 8];
|
||||||
5'd13: begin
|
end
|
||||||
output_axis_tdata_int = frame_count_output_reg[ 7: 0];
|
offset = offset + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (BYTE_COUNT_ENABLE) begin
|
||||||
|
for (i = BYTE_COUNT_BYTE_WIDTH-1; i >= 0; i = i - 1) begin
|
||||||
|
if (frame_ptr_reg == offset) begin
|
||||||
|
output_axis_tdata_int = byte_count_output_reg[i*8 +: 8];
|
||||||
|
end
|
||||||
|
offset = offset + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (FRAME_COUNT_ENABLE) begin
|
||||||
|
for (i = FRAME_COUNT_BYTE_WIDTH-1; i >= 0; i = i - 1) begin
|
||||||
|
if (frame_ptr_reg == offset) begin
|
||||||
|
output_axis_tdata_int = frame_count_output_reg[i*8 +: 8];
|
||||||
|
end
|
||||||
|
offset = offset + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (frame_ptr_reg == offset-1) begin
|
||||||
output_axis_tlast_int = 1;
|
output_axis_tlast_int = 1;
|
||||||
state_next = STATE_IDLE;
|
state_next = STATE_IDLE;
|
||||||
end
|
end
|
||||||
endcase
|
|
||||||
end else begin
|
end else begin
|
||||||
state_next = STATE_OUTPUT_DATA;
|
state_next = STATE_OUTPUT_DATA;
|
||||||
end
|
end
|
||||||
@ -207,7 +219,11 @@ always @* begin
|
|||||||
// valid transfer cycle
|
// valid transfer cycle
|
||||||
|
|
||||||
// increment byte count by number of words transferred
|
// increment byte count by number of words transferred
|
||||||
byte_count_next = byte_count_next + keep2count(monitor_axis_tkeep);
|
bit_cnt = 0;
|
||||||
|
for (i = 0; i < KEEP_WIDTH; i = i + 1) begin
|
||||||
|
bit_cnt = bit_cnt + monitor_axis_tkeep[i];
|
||||||
|
end
|
||||||
|
byte_count_next = byte_count_next + bit_cnt;
|
||||||
|
|
||||||
// count frames
|
// count frames
|
||||||
if (monitor_axis_tlast) begin
|
if (monitor_axis_tlast) begin
|
||||||
|
@ -102,7 +102,7 @@ initial begin
|
|||||||
end
|
end
|
||||||
|
|
||||||
axis_frame_join_4 #(
|
axis_frame_join_4 #(
|
||||||
.ENABLE_TAG(1)
|
.TAG_ENABLE(1)
|
||||||
)
|
)
|
||||||
UUT (
|
UUT (
|
||||||
.clk(clk),
|
.clk(clk),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user