mirror of
https://github.com/fpganinja/taxi.git
synced 2025-12-09 00:48:40 -08:00
lfsr: Add input and output enable parameters to LFSR module to remove dead code
Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
@@ -274,7 +274,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(1),
|
.LFSR_GALOIS(1),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(64)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
eth_crc (
|
eth_crc (
|
||||||
.data_in(input_data_d0),
|
.data_in(input_data_d0),
|
||||||
|
|||||||
@@ -284,7 +284,9 @@ for (genvar n = 0; n < 8; n = n + 1) begin : crc
|
|||||||
.LFSR_GALOIS(1),
|
.LFSR_GALOIS(1),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(8*(n+1))
|
.DATA_W(8*(n+1)),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
eth_crc (
|
eth_crc (
|
||||||
.data_in(s_tdata_reg[0 +: 8*(n+1)]),
|
.data_in(s_tdata_reg[0 +: 8*(n+1)]),
|
||||||
|
|||||||
@@ -198,7 +198,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(1),
|
.LFSR_GALOIS(1),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(8)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
eth_crc_8 (
|
eth_crc_8 (
|
||||||
.data_in(gmii_rxd_d0),
|
.data_in(gmii_rxd_d0),
|
||||||
|
|||||||
@@ -190,7 +190,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(1),
|
.LFSR_GALOIS(1),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(8)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
eth_crc_8 (
|
eth_crc_8 (
|
||||||
.data_in(s_tdata_reg),
|
.data_in(s_tdata_reg),
|
||||||
|
|||||||
@@ -206,7 +206,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(1),
|
.LFSR_GALOIS(1),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(32)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
eth_crc (
|
eth_crc (
|
||||||
.data_in(xgmii_rxd_d0),
|
.data_in(xgmii_rxd_d0),
|
||||||
|
|||||||
@@ -218,7 +218,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(1),
|
.LFSR_GALOIS(1),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(64)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
eth_crc (
|
eth_crc (
|
||||||
.data_in(xgmii_rxd_d0),
|
.data_in(xgmii_rxd_d0),
|
||||||
|
|||||||
@@ -208,7 +208,9 @@ for (genvar n = 0; n < 4; n = n + 1) begin : crc
|
|||||||
.LFSR_GALOIS(1),
|
.LFSR_GALOIS(1),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(8*(n+1))
|
.DATA_W(8*(n+1)),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
eth_crc (
|
eth_crc (
|
||||||
.data_in(s_tdata_reg[0 +: 8*(n+1)]),
|
.data_in(s_tdata_reg[0 +: 8*(n+1)]),
|
||||||
|
|||||||
@@ -216,7 +216,9 @@ for (genvar n = 0; n < 8; n = n + 1) begin : crc
|
|||||||
.LFSR_GALOIS(1),
|
.LFSR_GALOIS(1),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(8*(n+1))
|
.DATA_W(8*(n+1)),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
eth_crc (
|
eth_crc (
|
||||||
.data_in(s_tdata_reg[0 +: 8*(n+1)]),
|
.data_in(s_tdata_reg[0 +: 8*(n+1)]),
|
||||||
|
|||||||
@@ -155,7 +155,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(0),
|
.LFSR_GALOIS(0),
|
||||||
.LFSR_FEED_FORWARD(1),
|
.LFSR_FEED_FORWARD(1),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(DATA_W)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b1)
|
||||||
)
|
)
|
||||||
descrambler_inst (
|
descrambler_inst (
|
||||||
.data_in(serdes_rx_data_int),
|
.data_in(serdes_rx_data_int),
|
||||||
@@ -176,7 +178,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(0),
|
.LFSR_GALOIS(0),
|
||||||
.LFSR_FEED_FORWARD(1),
|
.LFSR_FEED_FORWARD(1),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(DATA_W+HDR_W)
|
.DATA_W(DATA_W+HDR_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b1)
|
||||||
)
|
)
|
||||||
prbs31_check_inst (
|
prbs31_check_inst (
|
||||||
.data_in(~{serdes_rx_data_int, serdes_rx_hdr_int}),
|
.data_in(~{serdes_rx_data_int, serdes_rx_hdr_int}),
|
||||||
|
|||||||
@@ -145,7 +145,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(0),
|
.LFSR_GALOIS(0),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(DATA_W)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b1)
|
||||||
)
|
)
|
||||||
scrambler_inst (
|
scrambler_inst (
|
||||||
.data_in(encoded_tx_data),
|
.data_in(encoded_tx_data),
|
||||||
@@ -166,7 +168,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(0),
|
.LFSR_GALOIS(0),
|
||||||
.LFSR_FEED_FORWARD(0),
|
.LFSR_FEED_FORWARD(0),
|
||||||
.REVERSE(1),
|
.REVERSE(1),
|
||||||
.DATA_W(DATA_W+HDR_W)
|
.DATA_W(DATA_W+HDR_W),
|
||||||
|
.DATA_IN_EN(1'b0),
|
||||||
|
.DATA_OUT_EN(1'b1)
|
||||||
)
|
)
|
||||||
prbs31_gen_inst (
|
prbs31_gen_inst (
|
||||||
.data_in('0),
|
.data_in('0),
|
||||||
|
|||||||
@@ -27,8 +27,11 @@ module taxi_lfsr #
|
|||||||
parameter logic LFSR_FEED_FORWARD = 1'b0,
|
parameter logic LFSR_FEED_FORWARD = 1'b0,
|
||||||
// bit-reverse input and output
|
// bit-reverse input and output
|
||||||
parameter logic REVERSE = 1'b0,
|
parameter logic REVERSE = 1'b0,
|
||||||
// width of data input
|
// width of data ports
|
||||||
parameter DATA_W = 8
|
parameter DATA_W = 8,
|
||||||
|
// enable data input and output
|
||||||
|
parameter logic DATA_IN_EN = 1'b1,
|
||||||
|
parameter logic DATA_OUT_EN = 1'b1
|
||||||
)
|
)
|
||||||
(
|
(
|
||||||
input wire logic [DATA_W-1:0] data_in,
|
input wire logic [DATA_W-1:0] data_in,
|
||||||
@@ -170,7 +173,10 @@ PRBS31 Fibonacci, inverted 31 31'h10000001 any
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function [LFSR_W+DATA_W-1:0][LFSR_W+DATA_W-1:0] lfsr_mask();
|
localparam IN_W = LFSR_W+(DATA_IN_EN ? DATA_W : 0);
|
||||||
|
localparam OUT_W = LFSR_W+(DATA_OUT_EN ? DATA_W : 0);
|
||||||
|
|
||||||
|
function [OUT_W-1:0][IN_W-1:0] lfsr_mask();
|
||||||
logic [LFSR_W-1:0] lfsr_mask_state[LFSR_W-1:0];
|
logic [LFSR_W-1:0] lfsr_mask_state[LFSR_W-1:0];
|
||||||
logic [DATA_W-1:0] lfsr_mask_data[LFSR_W-1:0];
|
logic [DATA_W-1:0] lfsr_mask_data[LFSR_W-1:0];
|
||||||
logic [LFSR_W-1:0] output_mask_state[DATA_W-1:0];
|
logic [LFSR_W-1:0] output_mask_state[DATA_W-1:0];
|
||||||
@@ -270,42 +276,73 @@ function [LFSR_W+DATA_W-1:0][LFSR_W+DATA_W-1:0] lfsr_mask();
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
// disable broken linter
|
||||||
|
/* verilator lint_off WIDTH */
|
||||||
if (REVERSE) begin
|
if (REVERSE) begin
|
||||||
// output reversed
|
// output reversed
|
||||||
for (integer i = 0; i < LFSR_W; i = i + 1) begin
|
for (integer i = 0; i < LFSR_W; i = i + 1) begin
|
||||||
for (integer j = 0; j < LFSR_W; j = j + 1) begin
|
for (integer j = 0; j < LFSR_W; j = j + 1) begin
|
||||||
lfsr_mask[i][j] = lfsr_mask_state[LFSR_W-i-1][LFSR_W-j-1];
|
lfsr_mask[i][j] = lfsr_mask_state[LFSR_W-i-1][LFSR_W-j-1];
|
||||||
end
|
end
|
||||||
for (integer j = 0; j < DATA_W; j = j + 1) begin
|
if (DATA_IN_EN) begin
|
||||||
lfsr_mask[i][j+LFSR_W] = lfsr_mask_data[LFSR_W-i-1][DATA_W-j-1];
|
for (integer j = 0; j < DATA_W; j = j + 1) begin
|
||||||
|
lfsr_mask[i][j+LFSR_W] = lfsr_mask_data[LFSR_W-i-1][DATA_W-j-1];
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for (integer i = 0; i < DATA_W; i = i + 1) begin
|
if (DATA_OUT_EN) begin
|
||||||
for (integer j = 0; j < LFSR_W; j = j + 1) begin
|
for (integer i = 0; i < DATA_W; i = i + 1) begin
|
||||||
lfsr_mask[i+LFSR_W][j] = output_mask_state[DATA_W-i-1][LFSR_W-j-1];
|
for (integer j = 0; j < LFSR_W; j = j + 1) begin
|
||||||
end
|
lfsr_mask[i+LFSR_W][j] = output_mask_state[DATA_W-i-1][LFSR_W-j-1];
|
||||||
for (integer j = 0; j < DATA_W; j = j + 1) begin
|
end
|
||||||
lfsr_mask[i+LFSR_W][j+LFSR_W] = output_mask_data[DATA_W-i-1][DATA_W-j-1];
|
if (DATA_IN_EN) begin
|
||||||
|
for (integer j = 0; j < DATA_W; j = j + 1) begin
|
||||||
|
lfsr_mask[i+LFSR_W][j+LFSR_W] = output_mask_data[DATA_W-i-1][DATA_W-j-1];
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else begin
|
end else begin
|
||||||
// output normal
|
// output normal
|
||||||
for (integer i = 0; i < LFSR_W; i = i + 1) begin
|
for (integer i = 0; i < LFSR_W; i = i + 1) begin
|
||||||
lfsr_mask[i] = {lfsr_mask_data[i], lfsr_mask_state[i]};
|
if (DATA_IN_EN) begin
|
||||||
|
lfsr_mask[i] = {lfsr_mask_data[i], lfsr_mask_state[i]};
|
||||||
|
end else begin
|
||||||
|
lfsr_mask[i] = lfsr_mask_state[i];
|
||||||
|
end
|
||||||
end
|
end
|
||||||
for (integer i = 0; i < DATA_W; i = i + 1) begin
|
if (DATA_OUT_EN) begin
|
||||||
lfsr_mask[i+LFSR_W] = {output_mask_data[i], output_mask_state[i]};
|
for (integer i = 0; i < DATA_W; i = i + 1) begin
|
||||||
|
if (DATA_IN_EN) begin
|
||||||
|
lfsr_mask[i+LFSR_W] = {output_mask_data[i], output_mask_state[i]};
|
||||||
|
end else begin
|
||||||
|
lfsr_mask[i+LFSR_W] = output_mask_state[i];
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
/* verilator lint_on WIDTH */
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
wire [LFSR_W+DATA_W-1:0][LFSR_W+DATA_W-1:0] mask = lfsr_mask();
|
wire [OUT_W-1:0][IN_W-1:0] mask = lfsr_mask();
|
||||||
|
|
||||||
for (genvar n = 0; n < LFSR_W; n = n + 1) begin : lfsr_state
|
for (genvar n = 0; n < LFSR_W; n = n + 1) begin : lfsr_state
|
||||||
assign state_out[n] = ^({data_in, state_in} & mask[n]);
|
if (DATA_IN_EN) begin
|
||||||
|
assign state_out[n] = ^({data_in, state_in} & mask[n]);
|
||||||
|
end else begin
|
||||||
|
assign state_out[n] = ^(state_in & mask[n]);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
for (genvar n = 0; n < DATA_W; n = n + 1) begin : lfsr_data
|
if (DATA_OUT_EN) begin
|
||||||
assign data_out[n] = ^({data_in, state_in} & mask[n+LFSR_W]);
|
for (genvar n = 0; n < DATA_W; n = n + 1) begin : lfsr_data
|
||||||
|
if (DATA_IN_EN) begin
|
||||||
|
assign data_out[n] = ^({data_in, state_in} & mask[n+LFSR_W]);
|
||||||
|
end else begin
|
||||||
|
assign data_out[n] = ^(state_in & mask[n+LFSR_W]);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
assign data_out = '0;
|
||||||
end
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
@@ -155,7 +155,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(LFSR_GALOIS),
|
.LFSR_GALOIS(LFSR_GALOIS),
|
||||||
.LFSR_FEED_FORWARD('0),
|
.LFSR_FEED_FORWARD('0),
|
||||||
.REVERSE(REVERSE),
|
.REVERSE(REVERSE),
|
||||||
.DATA_W(DATA_W)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b0)
|
||||||
)
|
)
|
||||||
lfsr_inst (
|
lfsr_inst (
|
||||||
.data_in(data_in),
|
.data_in(data_in),
|
||||||
|
|||||||
@@ -159,7 +159,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(LFSR_GALOIS),
|
.LFSR_GALOIS(LFSR_GALOIS),
|
||||||
.LFSR_FEED_FORWARD('1),
|
.LFSR_FEED_FORWARD('1),
|
||||||
.REVERSE(REVERSE),
|
.REVERSE(REVERSE),
|
||||||
.DATA_W(DATA_W)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b1)
|
||||||
)
|
)
|
||||||
lfsr_inst (
|
lfsr_inst (
|
||||||
.data_in(data_in),
|
.data_in(data_in),
|
||||||
|
|||||||
@@ -165,7 +165,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(LFSR_GALOIS),
|
.LFSR_GALOIS(LFSR_GALOIS),
|
||||||
.LFSR_FEED_FORWARD('1),
|
.LFSR_FEED_FORWARD('1),
|
||||||
.REVERSE(REVERSE),
|
.REVERSE(REVERSE),
|
||||||
.DATA_W(DATA_W)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b1)
|
||||||
)
|
)
|
||||||
lfsr_inst (
|
lfsr_inst (
|
||||||
.data_in(INVERT ? ~data_in : data_in),
|
.data_in(INVERT ? ~data_in : data_in),
|
||||||
|
|||||||
@@ -159,7 +159,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(LFSR_GALOIS),
|
.LFSR_GALOIS(LFSR_GALOIS),
|
||||||
.LFSR_FEED_FORWARD('0),
|
.LFSR_FEED_FORWARD('0),
|
||||||
.REVERSE(REVERSE),
|
.REVERSE(REVERSE),
|
||||||
.DATA_W(DATA_W)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b0),
|
||||||
|
.DATA_OUT_EN(1'b1)
|
||||||
)
|
)
|
||||||
lfsr_inst (
|
lfsr_inst (
|
||||||
.data_in('0),
|
.data_in('0),
|
||||||
|
|||||||
@@ -159,7 +159,9 @@ taxi_lfsr #(
|
|||||||
.LFSR_GALOIS(LFSR_GALOIS),
|
.LFSR_GALOIS(LFSR_GALOIS),
|
||||||
.LFSR_FEED_FORWARD('0),
|
.LFSR_FEED_FORWARD('0),
|
||||||
.REVERSE(REVERSE),
|
.REVERSE(REVERSE),
|
||||||
.DATA_W(DATA_W)
|
.DATA_W(DATA_W),
|
||||||
|
.DATA_IN_EN(1'b1),
|
||||||
|
.DATA_OUT_EN(1'b1)
|
||||||
)
|
)
|
||||||
lfsr_inst (
|
lfsr_inst (
|
||||||
.data_in(data_in),
|
.data_in(data_in),
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ export PARAM_LFSR_GALOIS ?= "1'b1"
|
|||||||
export PARAM_LFSR_FEED_FORWARD ?= "1'b0"
|
export PARAM_LFSR_FEED_FORWARD ?= "1'b0"
|
||||||
export PARAM_REVERSE ?= "1'b1"
|
export PARAM_REVERSE ?= "1'b1"
|
||||||
export PARAM_DATA_W ?= 8
|
export PARAM_DATA_W ?= 8
|
||||||
|
export PARAM_DATA_IN_EN ?= "1'b1"
|
||||||
|
export PARAM_DATA_OUT_EN ?= "1'b1"
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|||||||
@@ -220,6 +220,8 @@ def test_taxi_lfsr(request, lfsr_w, lfsr_poly, lfsr_galois, reverse, data_w):
|
|||||||
parameters['LFSR_FEED_FORWARD'] = "1'b0"
|
parameters['LFSR_FEED_FORWARD'] = "1'b0"
|
||||||
parameters['REVERSE'] = f"1'b{reverse}"
|
parameters['REVERSE'] = f"1'b{reverse}"
|
||||||
parameters['DATA_W'] = data_w
|
parameters['DATA_W'] = data_w
|
||||||
|
parameters['DATA_IN_EN'] = "1'b1"
|
||||||
|
parameters['DATA_OUT_EN'] = "1'b1"
|
||||||
|
|
||||||
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}
|
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user