diff --git a/src/eth/rtl/taxi_axis_baser_rx_64.sv b/src/eth/rtl/taxi_axis_baser_rx_64.sv index 22aadab..30e9852 100644 --- a/src/eth/rtl/taxi_axis_baser_rx_64.sv +++ b/src/eth/rtl/taxi_axis_baser_rx_64.sv @@ -274,7 +274,9 @@ taxi_lfsr #( .LFSR_GALOIS(1), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(64) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) eth_crc ( .data_in(input_data_d0), diff --git a/src/eth/rtl/taxi_axis_baser_tx_64.sv b/src/eth/rtl/taxi_axis_baser_tx_64.sv index 4e13bf8..edc0e6e 100644 --- a/src/eth/rtl/taxi_axis_baser_tx_64.sv +++ b/src/eth/rtl/taxi_axis_baser_tx_64.sv @@ -284,7 +284,9 @@ for (genvar n = 0; n < 8; n = n + 1) begin : crc .LFSR_GALOIS(1), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(8*(n+1)) + .DATA_W(8*(n+1)), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) eth_crc ( .data_in(s_tdata_reg[0 +: 8*(n+1)]), diff --git a/src/eth/rtl/taxi_axis_gmii_rx.sv b/src/eth/rtl/taxi_axis_gmii_rx.sv index 34dee75..8cb2aa3 100644 --- a/src/eth/rtl/taxi_axis_gmii_rx.sv +++ b/src/eth/rtl/taxi_axis_gmii_rx.sv @@ -198,7 +198,9 @@ taxi_lfsr #( .LFSR_GALOIS(1), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(8) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) eth_crc_8 ( .data_in(gmii_rxd_d0), diff --git a/src/eth/rtl/taxi_axis_gmii_tx.sv b/src/eth/rtl/taxi_axis_gmii_tx.sv index 9f95d82..7c212f8 100644 --- a/src/eth/rtl/taxi_axis_gmii_tx.sv +++ b/src/eth/rtl/taxi_axis_gmii_tx.sv @@ -190,7 +190,9 @@ taxi_lfsr #( .LFSR_GALOIS(1), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(8) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) eth_crc_8 ( .data_in(s_tdata_reg), diff --git a/src/eth/rtl/taxi_axis_xgmii_rx_32.sv b/src/eth/rtl/taxi_axis_xgmii_rx_32.sv index 508042e..f8fc145 100644 --- a/src/eth/rtl/taxi_axis_xgmii_rx_32.sv +++ b/src/eth/rtl/taxi_axis_xgmii_rx_32.sv @@ -206,7 +206,9 @@ taxi_lfsr #( .LFSR_GALOIS(1), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(32) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) eth_crc ( .data_in(xgmii_rxd_d0), diff --git a/src/eth/rtl/taxi_axis_xgmii_rx_64.sv b/src/eth/rtl/taxi_axis_xgmii_rx_64.sv index 42bc8b9..94baf0c 100644 --- a/src/eth/rtl/taxi_axis_xgmii_rx_64.sv +++ b/src/eth/rtl/taxi_axis_xgmii_rx_64.sv @@ -218,7 +218,9 @@ taxi_lfsr #( .LFSR_GALOIS(1), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(64) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) eth_crc ( .data_in(xgmii_rxd_d0), diff --git a/src/eth/rtl/taxi_axis_xgmii_tx_32.sv b/src/eth/rtl/taxi_axis_xgmii_tx_32.sv index eef7ee3..0e5eb29 100644 --- a/src/eth/rtl/taxi_axis_xgmii_tx_32.sv +++ b/src/eth/rtl/taxi_axis_xgmii_tx_32.sv @@ -208,7 +208,9 @@ for (genvar n = 0; n < 4; n = n + 1) begin : crc .LFSR_GALOIS(1), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(8*(n+1)) + .DATA_W(8*(n+1)), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) eth_crc ( .data_in(s_tdata_reg[0 +: 8*(n+1)]), diff --git a/src/eth/rtl/taxi_axis_xgmii_tx_64.sv b/src/eth/rtl/taxi_axis_xgmii_tx_64.sv index 6d6497d..03d53b2 100644 --- a/src/eth/rtl/taxi_axis_xgmii_tx_64.sv +++ b/src/eth/rtl/taxi_axis_xgmii_tx_64.sv @@ -216,7 +216,9 @@ for (genvar n = 0; n < 8; n = n + 1) begin : crc .LFSR_GALOIS(1), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(8*(n+1)) + .DATA_W(8*(n+1)), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) eth_crc ( .data_in(s_tdata_reg[0 +: 8*(n+1)]), diff --git a/src/eth/rtl/taxi_eth_phy_10g_rx_if.sv b/src/eth/rtl/taxi_eth_phy_10g_rx_if.sv index 009c67b..69907c8 100644 --- a/src/eth/rtl/taxi_eth_phy_10g_rx_if.sv +++ b/src/eth/rtl/taxi_eth_phy_10g_rx_if.sv @@ -155,7 +155,9 @@ taxi_lfsr #( .LFSR_GALOIS(0), .LFSR_FEED_FORWARD(1), .REVERSE(1), - .DATA_W(DATA_W) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b1) ) descrambler_inst ( .data_in(serdes_rx_data_int), @@ -176,7 +178,9 @@ taxi_lfsr #( .LFSR_GALOIS(0), .LFSR_FEED_FORWARD(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 ( .data_in(~{serdes_rx_data_int, serdes_rx_hdr_int}), diff --git a/src/eth/rtl/taxi_eth_phy_10g_tx_if.sv b/src/eth/rtl/taxi_eth_phy_10g_tx_if.sv index 4fb1290..9fa337b 100644 --- a/src/eth/rtl/taxi_eth_phy_10g_tx_if.sv +++ b/src/eth/rtl/taxi_eth_phy_10g_tx_if.sv @@ -145,7 +145,9 @@ taxi_lfsr #( .LFSR_GALOIS(0), .LFSR_FEED_FORWARD(0), .REVERSE(1), - .DATA_W(DATA_W) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b1) ) scrambler_inst ( .data_in(encoded_tx_data), @@ -166,7 +168,9 @@ taxi_lfsr #( .LFSR_GALOIS(0), .LFSR_FEED_FORWARD(0), .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 ( .data_in('0), diff --git a/src/lfsr/rtl/taxi_lfsr.sv b/src/lfsr/rtl/taxi_lfsr.sv index 5542510..1934c8b 100644 --- a/src/lfsr/rtl/taxi_lfsr.sv +++ b/src/lfsr/rtl/taxi_lfsr.sv @@ -27,8 +27,11 @@ module taxi_lfsr # parameter logic LFSR_FEED_FORWARD = 1'b0, // bit-reverse input and output parameter logic REVERSE = 1'b0, - // width of data input - parameter DATA_W = 8 + // width of data ports + 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, @@ -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 [DATA_W-1:0] lfsr_mask_data[LFSR_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 + // disable broken linter + /* verilator lint_off WIDTH */ if (REVERSE) begin // output reversed for (integer i = 0; i < LFSR_W; i = i + 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]; end - 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]; + if (DATA_IN_EN) begin + 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 - for (integer i = 0; i < DATA_W; i = i + 1) begin - for (integer j = 0; j < LFSR_W; j = j + 1) begin - lfsr_mask[i+LFSR_W][j] = output_mask_state[DATA_W-i-1][LFSR_W-j-1]; - end - 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]; + if (DATA_OUT_EN) begin + for (integer i = 0; i < DATA_W; i = i + 1) begin + for (integer j = 0; j < LFSR_W; j = j + 1) begin + lfsr_mask[i+LFSR_W][j] = output_mask_state[DATA_W-i-1][LFSR_W-j-1]; + end + 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 else begin // output normal 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 - for (integer i = 0; i < DATA_W; i = i + 1) begin - lfsr_mask[i+LFSR_W] = {output_mask_data[i], output_mask_state[i]}; + if (DATA_OUT_EN) begin + 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 + /* verilator lint_on WIDTH */ 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 - 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 -for (genvar n = 0; n < DATA_W; n = n + 1) begin : lfsr_data - assign data_out[n] = ^({data_in, state_in} & mask[n+LFSR_W]); +if (DATA_OUT_EN) begin + 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 endmodule diff --git a/src/lfsr/rtl/taxi_lfsr_crc.sv b/src/lfsr/rtl/taxi_lfsr_crc.sv index d0942e0..fd0222f 100644 --- a/src/lfsr/rtl/taxi_lfsr_crc.sv +++ b/src/lfsr/rtl/taxi_lfsr_crc.sv @@ -155,7 +155,9 @@ taxi_lfsr #( .LFSR_GALOIS(LFSR_GALOIS), .LFSR_FEED_FORWARD('0), .REVERSE(REVERSE), - .DATA_W(DATA_W) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b0) ) lfsr_inst ( .data_in(data_in), diff --git a/src/lfsr/rtl/taxi_lfsr_descramble.sv b/src/lfsr/rtl/taxi_lfsr_descramble.sv index 49a50f7..0aa4f90 100644 --- a/src/lfsr/rtl/taxi_lfsr_descramble.sv +++ b/src/lfsr/rtl/taxi_lfsr_descramble.sv @@ -159,7 +159,9 @@ taxi_lfsr #( .LFSR_GALOIS(LFSR_GALOIS), .LFSR_FEED_FORWARD('1), .REVERSE(REVERSE), - .DATA_W(DATA_W) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b1) ) lfsr_inst ( .data_in(data_in), diff --git a/src/lfsr/rtl/taxi_lfsr_prbs_check.sv b/src/lfsr/rtl/taxi_lfsr_prbs_check.sv index c9acaf3..38c4ee4 100644 --- a/src/lfsr/rtl/taxi_lfsr_prbs_check.sv +++ b/src/lfsr/rtl/taxi_lfsr_prbs_check.sv @@ -165,7 +165,9 @@ taxi_lfsr #( .LFSR_GALOIS(LFSR_GALOIS), .LFSR_FEED_FORWARD('1), .REVERSE(REVERSE), - .DATA_W(DATA_W) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b1) ) lfsr_inst ( .data_in(INVERT ? ~data_in : data_in), diff --git a/src/lfsr/rtl/taxi_lfsr_prbs_gen.sv b/src/lfsr/rtl/taxi_lfsr_prbs_gen.sv index 5a85f67..b228caf 100644 --- a/src/lfsr/rtl/taxi_lfsr_prbs_gen.sv +++ b/src/lfsr/rtl/taxi_lfsr_prbs_gen.sv @@ -159,7 +159,9 @@ taxi_lfsr #( .LFSR_GALOIS(LFSR_GALOIS), .LFSR_FEED_FORWARD('0), .REVERSE(REVERSE), - .DATA_W(DATA_W) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b0), + .DATA_OUT_EN(1'b1) ) lfsr_inst ( .data_in('0), diff --git a/src/lfsr/rtl/taxi_lfsr_scramble.sv b/src/lfsr/rtl/taxi_lfsr_scramble.sv index 9380d71..3ee42a2 100644 --- a/src/lfsr/rtl/taxi_lfsr_scramble.sv +++ b/src/lfsr/rtl/taxi_lfsr_scramble.sv @@ -159,7 +159,9 @@ taxi_lfsr #( .LFSR_GALOIS(LFSR_GALOIS), .LFSR_FEED_FORWARD('0), .REVERSE(REVERSE), - .DATA_W(DATA_W) + .DATA_W(DATA_W), + .DATA_IN_EN(1'b1), + .DATA_OUT_EN(1'b1) ) lfsr_inst ( .data_in(data_in), diff --git a/src/lfsr/tb/taxi_lfsr/Makefile b/src/lfsr/tb/taxi_lfsr/Makefile index 436453e..6509501 100644 --- a/src/lfsr/tb/taxi_lfsr/Makefile +++ b/src/lfsr/tb/taxi_lfsr/Makefile @@ -35,6 +35,8 @@ export PARAM_LFSR_GALOIS ?= "1'b1" export PARAM_LFSR_FEED_FORWARD ?= "1'b0" export PARAM_REVERSE ?= "1'b1" export PARAM_DATA_W ?= 8 +export PARAM_DATA_IN_EN ?= "1'b1" +export PARAM_DATA_OUT_EN ?= "1'b1" ifeq ($(SIM), icarus) PLUSARGS += -fst diff --git a/src/lfsr/tb/taxi_lfsr/test_taxi_lfsr.py b/src/lfsr/tb/taxi_lfsr/test_taxi_lfsr.py index 34a39df..bc5b8bf 100644 --- a/src/lfsr/tb/taxi_lfsr/test_taxi_lfsr.py +++ b/src/lfsr/tb/taxi_lfsr/test_taxi_lfsr.py @@ -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['REVERSE'] = f"1'b{reverse}" 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()}