`include "setseed.vh" module top(input clk, stb, di, output do); localparam integer DIN_N = 10; localparam integer DOUT_N = 10; reg [DIN_N-1:0] din; wire [DOUT_N-1:0] dout; reg [DIN_N-1:0] din_shr; reg [DOUT_N-1:0] dout_shr; always @(posedge clk) begin din_shr <= {din_shr, di}; dout_shr <= {dout_shr, din_shr[DIN_N-1]}; if (stb) begin din <= din_shr; dout_shr <= dout; end end assign do = dout_shr[DOUT_N-1]; roi roi ( .clk(clk), .din(din), .dout(dout) ); endmodule module roi(input clk, input [9:0] din, output [9:0] dout); localparam integer N = 200; function [31:0] xorshift32(input [31:0] v); begin xorshift32 = v; xorshift32 = xorshift32 ^ (xorshift32 << 13); xorshift32 = xorshift32 ^ (xorshift32 >> 17); xorshift32 = xorshift32 ^ (xorshift32 << 5); end endfunction function [31:0] hash32(input [31:0] v); begin hash32 = v ^ `SEED; hash32 = xorshift32(hash32); hash32 = xorshift32(hash32); hash32 = xorshift32(hash32); hash32 = xorshift32(hash32); end endfunction function [63:0] hash64(input [31:0] v); begin hash64[63:32] = hash32(v); hash64[31: 0] = hash32(~v); end endfunction wire [N*10+9:0] nets; assign nets[9:0] = din; assign dout = nets[N*10+9:N*10]; genvar i, j; generate for (i = 0; i < N; i = i+1) begin:is for (j = 0; j < 10; j = j+1) begin:js localparam integer k = i*10 + j + 10; wire lut_out; LUT6 #( .INIT(hash64({i, j, 8'hff})) ) lut ( .I0(nets[hash32({i, j, 8'h00}) % k]), .I1(nets[hash32({i, j, 8'h01}) % k]), .I2(nets[k-10]), .I3(nets[k-9]), .I4(nets[k-8]), .I5(nets[k-7]), .O(lut_out) ); reg lut_out_reg; always @(posedge clk) lut_out_reg <= lut_out; assign nets[k] = ((i+j) % 17) < 10 ? lut_out_reg : lut_out; end end endgenerate endmodule