Files
gps/hardware/generated/genesys2-soc-verilog/TLFpgaSPI.sv
T
2026-08-06 22:14:52 +03:00

151 lines
5.8 KiB
Systemverilog

// Generated by CIRCT firtool-1.151.0
module TLFpgaSPI(
input clock,
reset,
output auto_in_a_ready,
input auto_in_a_valid,
input [2:0] auto_in_a_bits_opcode,
input [1:0] auto_in_a_bits_size,
input [5:0] auto_in_a_bits_source,
input [28:0] auto_in_a_bits_address,
input [7:0] auto_in_a_bits_mask,
input [63:0] auto_in_a_bits_data,
input auto_in_d_ready,
output auto_in_d_valid,
output [2:0] auto_in_d_bits_opcode,
output [1:0] auto_in_d_bits_size,
output [5:0] auto_in_d_bits_source,
output [63:0] auto_in_d_bits_data,
output [3:0] auto_dq_oe_out,
auto_dq_out_out,
input [3:0] auto_dq_in_in,
output auto_csn_out,
auto_sck_out
);
wire _out_back_front_q_io_deq_valid;
wire _out_back_front_q_io_deq_bits_read;
wire [8:0] _out_back_front_q_io_deq_bits_index;
wire [63:0] _out_back_front_q_io_deq_bits_data;
wire [7:0] _out_back_front_q_io_deq_bits_mask;
reg csn;
reg sck;
reg quad;
reg cpol;
reg cpha;
reg [31:0] txShift;
reg [31:0] rxShift;
reg [5:0] bitsLeft;
reg busy;
reg [2:0] div;
wire _out_out_bits_data_WIRE_1 =
_out_back_front_q_io_deq_bits_index[8:1] == 8'h0;
wire out_woready_1 =
_out_back_front_q_io_deq_valid & auto_in_d_ready & ~_out_back_front_q_io_deq_bits_read
& ~(_out_back_front_q_io_deq_bits_index[0]) & _out_out_bits_data_WIRE_1;
always @(posedge clock) begin
if (reset) begin
csn <= 1'h1;
sck <= 1'h0;
quad <= 1'h0;
cpol <= 1'h0;
cpha <= 1'h0;
txShift <= 32'h0;
rxShift <= 32'h0;
bitsLeft <= 6'h0;
busy <= 1'h0;
div <= 3'h0;
end
else begin
automatic logic _GEN;
automatic logic _sampleEdge_T = sck != cpol;
automatic logic sampleEdge;
automatic logic advanceEdge;
automatic logic [5:0] _GEN_0;
automatic logic _GEN_1;
automatic logic _GEN_2;
automatic logic _out_T_6;
automatic logic _out_T_19 =
out_woready_1
& (&{{8{_out_back_front_q_io_deq_bits_mask[7]}},
{8{_out_back_front_q_io_deq_bits_mask[6]}},
{8{_out_back_front_q_io_deq_bits_mask[5]}},
{8{_out_back_front_q_io_deq_bits_mask[4]}}}) & ~busy;
_GEN = &div;
sampleEdge = cpha ? _sampleEdge_T : sck == cpol;
advanceEdge = cpha ? _sampleEdge_T : ~sampleEdge;
_GEN_0 = {3'h0, quad ? 3'h4 : 3'h1};
_GEN_1 = bitsLeft <= _GEN_0;
_GEN_2 = advanceEdge & _GEN_1;
_out_T_6 =
out_woready_1
& (&{{8{_out_back_front_q_io_deq_bits_mask[3]}},
{8{_out_back_front_q_io_deq_bits_mask[2]}},
{8{_out_back_front_q_io_deq_bits_mask[1]}},
{8{_out_back_front_q_io_deq_bits_mask[0]}}}) & ~busy;
if (_out_T_6) begin
csn <= _out_back_front_q_io_deq_bits_data[1];
quad <= _out_back_front_q_io_deq_bits_data[2];
cpol <= _out_back_front_q_io_deq_bits_data[3];
cpha <= _out_back_front_q_io_deq_bits_data[4];
end
if (_out_T_19) begin
sck <= cpol;
txShift <= _out_back_front_q_io_deq_bits_data[63:32];
rxShift <= 32'h0;
bitsLeft <= quad ? 6'h20 : 6'h8;
div <= 3'h0;
end
else begin
if (_out_T_6)
sck <= _out_back_front_q_io_deq_bits_data[3];
else if (busy & _GEN)
sck <= _GEN_2 ? cpol : ~sck;
if (busy & _GEN & advanceEdge) begin
txShift <= quad ? {txShift[27:0], 4'h0} : {txShift[30:0], 1'h0};
bitsLeft <= _GEN_1 ? 6'h0 : bitsLeft - _GEN_0;
end
if (busy & _GEN & sampleEdge)
rxShift <=
quad ? {rxShift[27:0], auto_dq_in_in} : {rxShift[30:0], auto_dq_in_in[1]};
if (busy)
div <= _GEN ? 3'h0 : div + 3'h1;
end
busy <= _out_T_19 | ~(busy & _GEN & _GEN_2) & busy;
end
end // always @(posedge)
Queue1_RegMapperInput_i9_m8 out_back_front_q (
.clock (clock),
.reset (reset),
.io_enq_ready (auto_in_a_ready),
.io_enq_valid (auto_in_a_valid),
.io_enq_bits_read (auto_in_a_bits_opcode == 3'h4),
.io_enq_bits_index (auto_in_a_bits_address[11:3]),
.io_enq_bits_data (auto_in_a_bits_data),
.io_enq_bits_mask (auto_in_a_bits_mask),
.io_enq_bits_extra_tlrr_extra_source (auto_in_a_bits_source),
.io_enq_bits_extra_tlrr_extra_size (auto_in_a_bits_size),
.io_deq_ready (auto_in_d_ready),
.io_deq_valid (_out_back_front_q_io_deq_valid),
.io_deq_bits_read (_out_back_front_q_io_deq_bits_read),
.io_deq_bits_index (_out_back_front_q_io_deq_bits_index),
.io_deq_bits_data (_out_back_front_q_io_deq_bits_data),
.io_deq_bits_mask (_out_back_front_q_io_deq_bits_mask),
.io_deq_bits_extra_tlrr_extra_source (auto_in_d_bits_source),
.io_deq_bits_extra_tlrr_extra_size (auto_in_d_bits_size)
);
assign auto_in_d_valid = _out_back_front_q_io_deq_valid;
assign auto_in_d_bits_opcode = {2'h0, _out_back_front_q_io_deq_bits_read};
assign auto_in_d_bits_data =
_out_out_bits_data_WIRE_1
? (_out_back_front_q_io_deq_bits_index[0]
? {31'h0, ~busy, rxShift}
: {59'h0, cpha, cpol, quad, csn, busy})
: 64'h0;
assign auto_dq_oe_out = csn | ~busy ? 4'h0 : quad ? 4'hF : 4'h1;
assign auto_dq_out_out = quad ? txShift[31:28] : {3'h0, txShift[31]};
assign auto_csn_out = csn;
assign auto_sck_out = sck;
endmodule