267 lines
13 KiB
Systemverilog
267 lines
13 KiB
Systemverilog
// Generated by CIRCT firtool-1.151.0
|
|
|
|
// Users can define 'PRINTF_COND' to add an extra gate to prints.
|
|
`ifndef PRINTF_COND_
|
|
`ifdef PRINTF_COND
|
|
`define PRINTF_COND_ (`PRINTF_COND)
|
|
`else // PRINTF_COND
|
|
`define PRINTF_COND_ 1
|
|
`endif // PRINTF_COND
|
|
`endif // not def PRINTF_COND_
|
|
module TLFragmenter_FPGAGPS(
|
|
input clock,
|
|
reset,
|
|
output auto_anon_in_a_ready,
|
|
input auto_anon_in_a_valid,
|
|
input [2:0] auto_anon_in_a_bits_opcode,
|
|
auto_anon_in_a_bits_param,
|
|
auto_anon_in_a_bits_size,
|
|
input [1:0] auto_anon_in_a_bits_source,
|
|
input [28:0] auto_anon_in_a_bits_address,
|
|
input auto_anon_in_a_bits_user_amba_prot_bufferable,
|
|
auto_anon_in_a_bits_user_amba_prot_modifiable,
|
|
auto_anon_in_a_bits_user_amba_prot_readalloc,
|
|
auto_anon_in_a_bits_user_amba_prot_writealloc,
|
|
auto_anon_in_a_bits_user_amba_prot_privileged,
|
|
auto_anon_in_a_bits_user_amba_prot_secure,
|
|
auto_anon_in_a_bits_user_amba_prot_fetch,
|
|
input [3:0] auto_anon_in_a_bits_mask,
|
|
input [31:0] auto_anon_in_a_bits_data,
|
|
input auto_anon_in_a_bits_corrupt,
|
|
auto_anon_in_d_ready,
|
|
output auto_anon_in_d_valid,
|
|
output [2:0] auto_anon_in_d_bits_opcode,
|
|
output [1:0] auto_anon_in_d_bits_param,
|
|
output [2:0] auto_anon_in_d_bits_size,
|
|
output [1:0] auto_anon_in_d_bits_source,
|
|
output auto_anon_in_d_bits_sink,
|
|
auto_anon_in_d_bits_denied,
|
|
output [31:0] auto_anon_in_d_bits_data,
|
|
output auto_anon_in_d_bits_corrupt,
|
|
input auto_anon_out_a_ready,
|
|
output auto_anon_out_a_valid,
|
|
output [2:0] auto_anon_out_a_bits_opcode,
|
|
auto_anon_out_a_bits_param,
|
|
output [1:0] auto_anon_out_a_bits_size,
|
|
output [6:0] auto_anon_out_a_bits_source,
|
|
output [28:0] auto_anon_out_a_bits_address,
|
|
output auto_anon_out_a_bits_user_amba_prot_bufferable,
|
|
auto_anon_out_a_bits_user_amba_prot_modifiable,
|
|
auto_anon_out_a_bits_user_amba_prot_readalloc,
|
|
auto_anon_out_a_bits_user_amba_prot_writealloc,
|
|
auto_anon_out_a_bits_user_amba_prot_privileged,
|
|
auto_anon_out_a_bits_user_amba_prot_secure,
|
|
auto_anon_out_a_bits_user_amba_prot_fetch,
|
|
output [3:0] auto_anon_out_a_bits_mask,
|
|
output [31:0] auto_anon_out_a_bits_data,
|
|
output auto_anon_out_a_bits_corrupt,
|
|
auto_anon_out_d_ready,
|
|
input auto_anon_out_d_valid,
|
|
input [2:0] auto_anon_out_d_bits_opcode,
|
|
input [1:0] auto_anon_out_d_bits_param,
|
|
auto_anon_out_d_bits_size,
|
|
input [6:0] auto_anon_out_d_bits_source,
|
|
input auto_anon_out_d_bits_sink,
|
|
auto_anon_out_d_bits_denied,
|
|
input [31:0] auto_anon_out_d_bits_data,
|
|
input auto_anon_out_d_bits_corrupt
|
|
);
|
|
|
|
wire _repeater_io_full;
|
|
wire _repeater_io_deq_valid;
|
|
wire [2:0] _repeater_io_deq_bits_opcode;
|
|
wire [2:0] _repeater_io_deq_bits_size;
|
|
wire [1:0] _repeater_io_deq_bits_source;
|
|
wire [28:0] _repeater_io_deq_bits_address;
|
|
wire [3:0] _repeater_io_deq_bits_mask;
|
|
reg [3:0] acknum;
|
|
reg [2:0] dOrig;
|
|
reg dToggle;
|
|
wire _d_denied_T = |acknum;
|
|
wire [4:0] _dsizeOH1_T = 5'h3 << auto_anon_out_d_bits_size;
|
|
wire [3:0] _GEN = ~(auto_anon_out_d_bits_source[3:0]);
|
|
wire [2:0] dFirst_size_hi = auto_anon_out_d_bits_source[3:1] & {1'h1, _GEN[3:2]};
|
|
wire [2:0] _dFirst_size_T_8 =
|
|
{1'h0, dFirst_size_hi[2:1]} | {auto_anon_out_d_bits_source[0], ~(_dsizeOH1_T[1:0])}
|
|
& {_GEN[1:0], _dsizeOH1_T[1]};
|
|
wire [2:0] dFirst_size =
|
|
{|dFirst_size_hi,
|
|
|(_dFirst_size_T_8[2:1]),
|
|
_dFirst_size_T_8[2] | _dFirst_size_T_8[0]};
|
|
wire drop =
|
|
~(auto_anon_out_d_bits_opcode[0]) & (|(auto_anon_out_d_bits_source[3:0]));
|
|
wire anonOut_d_ready = auto_anon_in_d_ready | drop;
|
|
reg r_denied;
|
|
wire d_denied = _d_denied_T & r_denied | auto_anon_out_d_bits_denied;
|
|
wire [1:0] _maxLgHint_T = {_repeater_io_deq_bits_address[15:12] == 4'h0, 1'h0};
|
|
wire [1:0] _maxLgHint_T_1 =
|
|
{{_repeater_io_deq_bits_address[15:13], ~(_repeater_io_deq_bits_address[12])} == 4'h0,
|
|
1'h0};
|
|
wire [1:0] _maxLgHint_T_2 =
|
|
{{_repeater_io_deq_bits_address[15:14],
|
|
_repeater_io_deq_bits_address[13:12] ^ 2'h2} == 4'h0,
|
|
1'h0};
|
|
wire [1:0] _maxLgHint_T_3 =
|
|
{{_repeater_io_deq_bits_address[15:14],
|
|
~(_repeater_io_deq_bits_address[13:12])} == 4'h0,
|
|
1'h0};
|
|
wire [1:0] _maxLgHint_T_4 =
|
|
{{_repeater_io_deq_bits_address[15],
|
|
_repeater_io_deq_bits_address[14:12] ^ 3'h4} == 4'h0,
|
|
1'h0};
|
|
wire [1:0] _maxLgHint_T_5 =
|
|
{{_repeater_io_deq_bits_address[15],
|
|
_repeater_io_deq_bits_address[14:12] ^ 3'h5} == 4'h0,
|
|
1'h0};
|
|
wire [1:0] _maxLgHint_T_6 =
|
|
{{_repeater_io_deq_bits_address[15],
|
|
_repeater_io_deq_bits_address[14:12] ^ 3'h6} == 4'h0,
|
|
1'h0};
|
|
wire [1:0] _maxLgHint_T_7 =
|
|
{{_repeater_io_deq_bits_address[15], ~(_repeater_io_deq_bits_address[14:12])} == 4'h0,
|
|
1'h0};
|
|
wire [1:0] _maxLgHint_T_8 = {_repeater_io_deq_bits_address[15:12] == 4'h8, 1'h0};
|
|
wire [1:0] _maxLgHint_T_9 = {_repeater_io_deq_bits_address[15:12] == 4'h9, 1'h0};
|
|
wire [1:0] _maxLgHint_T_10 = {_repeater_io_deq_bits_address[15:12] == 4'hA, 1'h0};
|
|
wire [7:0][1:0] _GEN_0 =
|
|
{{2'h2},
|
|
{2'h2},
|
|
{_maxLgHint_T | _maxLgHint_T_1 | _maxLgHint_T_2 | _maxLgHint_T_3 | _maxLgHint_T_4
|
|
| _maxLgHint_T_5 | _maxLgHint_T_6 | _maxLgHint_T_7 | _maxLgHint_T_8
|
|
| _maxLgHint_T_9 | _maxLgHint_T_10},
|
|
{_maxLgHint_T | _maxLgHint_T_1 | _maxLgHint_T_2 | _maxLgHint_T_3 | _maxLgHint_T_4
|
|
| _maxLgHint_T_5 | _maxLgHint_T_6 | _maxLgHint_T_7 | _maxLgHint_T_8
|
|
| _maxLgHint_T_9 | _maxLgHint_T_10},
|
|
{_maxLgHint_T | _maxLgHint_T_1 | _maxLgHint_T_2 | _maxLgHint_T_3 | _maxLgHint_T_4
|
|
| _maxLgHint_T_5 | _maxLgHint_T_6 | _maxLgHint_T_7 | _maxLgHint_T_8
|
|
| _maxLgHint_T_9 | _maxLgHint_T_10},
|
|
{_maxLgHint_T | _maxLgHint_T_1 | _maxLgHint_T_2 | _maxLgHint_T_3 | _maxLgHint_T_4
|
|
| _maxLgHint_T_5 | _maxLgHint_T_6 | _maxLgHint_T_7 | _maxLgHint_T_8
|
|
| _maxLgHint_T_9 | _maxLgHint_T_10},
|
|
{_maxLgHint_T | _maxLgHint_T_1 | _maxLgHint_T_2 | _maxLgHint_T_3 | _maxLgHint_T_4
|
|
| _maxLgHint_T_5 | _maxLgHint_T_6 | _maxLgHint_T_7 | _maxLgHint_T_8
|
|
| _maxLgHint_T_9 | _maxLgHint_T_10},
|
|
{_maxLgHint_T | _maxLgHint_T_1 | _maxLgHint_T_2 | _maxLgHint_T_3 | _maxLgHint_T_4
|
|
| _maxLgHint_T_5 | _maxLgHint_T_6 | _maxLgHint_T_7 | _maxLgHint_T_8
|
|
| _maxLgHint_T_9 | _maxLgHint_T_10}};
|
|
wire [1:0] limit = _GEN_0[_repeater_io_deq_bits_opcode];
|
|
wire [12:0] _aOrigOH1_T = 13'h3F << _repeater_io_deq_bits_size;
|
|
reg [3:0] gennum;
|
|
wire aFirst = gennum == 4'h0;
|
|
wire [3:0] aFragnum = aFirst ? ~(_aOrigOH1_T[5:2]) : gennum - 4'h1;
|
|
reg aToggle_r;
|
|
wire _GEN_1 = ~_repeater_io_full | _repeater_io_deq_bits_opcode[2];
|
|
wire _GEN_2 = ~_repeater_io_full | (&_repeater_io_deq_bits_mask);
|
|
`ifndef SYNTHESIS
|
|
always @(posedge clock) begin
|
|
if ((`PRINTF_COND_) & ~reset & ~_GEN_1)
|
|
$fwrite(32'h80000002,
|
|
"Assertion failed\n at Fragmenter.scala:321 assert (!repeater.io.full || !aHasData)\n");
|
|
if ((`PRINTF_COND_) & ~reset & ~_GEN_2)
|
|
$fwrite(32'h80000002,
|
|
"Assertion failed\n at Fragmenter.scala:324 assert (!repeater.io.full || in_a.bits.mask === fullMask)\n");
|
|
end // always @(posedge)
|
|
`endif // not def SYNTHESIS
|
|
always @(posedge clock) begin
|
|
automatic logic _GEN_3;
|
|
automatic logic _GEN_4;
|
|
_GEN_3 = anonOut_d_ready & auto_anon_out_d_valid;
|
|
_GEN_4 = _GEN_3 & ~_d_denied_T;
|
|
if (~reset) begin
|
|
end
|
|
if (reset) begin
|
|
acknum <= 4'h0;
|
|
dToggle <= 1'h0;
|
|
gennum <= 4'h0;
|
|
end
|
|
else begin
|
|
if (_GEN_3)
|
|
acknum <=
|
|
_d_denied_T
|
|
? acknum
|
|
- {3'h0, auto_anon_out_d_bits_opcode[0] | auto_anon_out_d_bits_size == 2'h2}
|
|
: auto_anon_out_d_bits_source[3:0];
|
|
if (_GEN_4)
|
|
dToggle <= auto_anon_out_d_bits_source[4];
|
|
if (auto_anon_out_a_ready & _repeater_io_deq_valid)
|
|
gennum <= aFragnum;
|
|
end
|
|
if (_GEN_4)
|
|
dOrig <= dFirst_size;
|
|
if (_GEN_3)
|
|
r_denied <= d_denied;
|
|
if (aFirst)
|
|
aToggle_r <= dToggle;
|
|
end // always @(posedge)
|
|
Repeater_TLBundleA_a29d32s2k1z3u repeater (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_repeat
|
|
(_repeater_io_deq_bits_opcode[2] & (|aFragnum)),
|
|
.io_full (_repeater_io_full),
|
|
.io_enq_ready (auto_anon_in_a_ready),
|
|
.io_enq_valid (auto_anon_in_a_valid),
|
|
.io_enq_bits_opcode (auto_anon_in_a_bits_opcode),
|
|
.io_enq_bits_param (auto_anon_in_a_bits_param),
|
|
.io_enq_bits_size (auto_anon_in_a_bits_size),
|
|
.io_enq_bits_source (auto_anon_in_a_bits_source),
|
|
.io_enq_bits_address (auto_anon_in_a_bits_address),
|
|
.io_enq_bits_user_amba_prot_bufferable
|
|
(auto_anon_in_a_bits_user_amba_prot_bufferable),
|
|
.io_enq_bits_user_amba_prot_modifiable
|
|
(auto_anon_in_a_bits_user_amba_prot_modifiable),
|
|
.io_enq_bits_user_amba_prot_readalloc (auto_anon_in_a_bits_user_amba_prot_readalloc),
|
|
.io_enq_bits_user_amba_prot_writealloc
|
|
(auto_anon_in_a_bits_user_amba_prot_writealloc),
|
|
.io_enq_bits_user_amba_prot_privileged
|
|
(auto_anon_in_a_bits_user_amba_prot_privileged),
|
|
.io_enq_bits_user_amba_prot_secure (auto_anon_in_a_bits_user_amba_prot_secure),
|
|
.io_enq_bits_user_amba_prot_fetch (auto_anon_in_a_bits_user_amba_prot_fetch),
|
|
.io_enq_bits_mask (auto_anon_in_a_bits_mask),
|
|
.io_enq_bits_corrupt (auto_anon_in_a_bits_corrupt),
|
|
.io_deq_ready (auto_anon_out_a_ready),
|
|
.io_deq_valid (_repeater_io_deq_valid),
|
|
.io_deq_bits_opcode (_repeater_io_deq_bits_opcode),
|
|
.io_deq_bits_param (auto_anon_out_a_bits_param),
|
|
.io_deq_bits_size (_repeater_io_deq_bits_size),
|
|
.io_deq_bits_source (_repeater_io_deq_bits_source),
|
|
.io_deq_bits_address (_repeater_io_deq_bits_address),
|
|
.io_deq_bits_user_amba_prot_bufferable
|
|
(auto_anon_out_a_bits_user_amba_prot_bufferable),
|
|
.io_deq_bits_user_amba_prot_modifiable
|
|
(auto_anon_out_a_bits_user_amba_prot_modifiable),
|
|
.io_deq_bits_user_amba_prot_readalloc
|
|
(auto_anon_out_a_bits_user_amba_prot_readalloc),
|
|
.io_deq_bits_user_amba_prot_writealloc
|
|
(auto_anon_out_a_bits_user_amba_prot_writealloc),
|
|
.io_deq_bits_user_amba_prot_privileged
|
|
(auto_anon_out_a_bits_user_amba_prot_privileged),
|
|
.io_deq_bits_user_amba_prot_secure (auto_anon_out_a_bits_user_amba_prot_secure),
|
|
.io_deq_bits_user_amba_prot_fetch (auto_anon_out_a_bits_user_amba_prot_fetch),
|
|
.io_deq_bits_mask (_repeater_io_deq_bits_mask),
|
|
.io_deq_bits_corrupt (auto_anon_out_a_bits_corrupt)
|
|
);
|
|
assign auto_anon_in_d_valid = auto_anon_out_d_valid & ~drop;
|
|
assign auto_anon_in_d_bits_opcode = auto_anon_out_d_bits_opcode;
|
|
assign auto_anon_in_d_bits_param = auto_anon_out_d_bits_param;
|
|
assign auto_anon_in_d_bits_size = _d_denied_T ? dOrig : dFirst_size;
|
|
assign auto_anon_in_d_bits_source = auto_anon_out_d_bits_source[6:5];
|
|
assign auto_anon_in_d_bits_sink = auto_anon_out_d_bits_sink;
|
|
assign auto_anon_in_d_bits_denied = d_denied;
|
|
assign auto_anon_in_d_bits_data = auto_anon_out_d_bits_data;
|
|
assign auto_anon_in_d_bits_corrupt = auto_anon_out_d_bits_corrupt;
|
|
assign auto_anon_out_a_valid = _repeater_io_deq_valid;
|
|
assign auto_anon_out_a_bits_opcode = _repeater_io_deq_bits_opcode;
|
|
assign auto_anon_out_a_bits_size =
|
|
_repeater_io_deq_bits_size > {1'h0, limit} ? limit : _repeater_io_deq_bits_size[1:0];
|
|
assign auto_anon_out_a_bits_source =
|
|
{_repeater_io_deq_bits_source, ~(aFirst ? dToggle : aToggle_r), aFragnum};
|
|
assign auto_anon_out_a_bits_address =
|
|
{_repeater_io_deq_bits_address[28:6],
|
|
_repeater_io_deq_bits_address[5:0] | {~(aFragnum | _aOrigOH1_T[5:2]), 2'h0}};
|
|
assign auto_anon_out_a_bits_mask = _repeater_io_full ? 4'hF : auto_anon_in_a_bits_mask;
|
|
assign auto_anon_out_a_bits_data = auto_anon_in_a_bits_data;
|
|
assign auto_anon_out_d_ready = anonOut_d_ready;
|
|
endmodule
|
|
|