139 lines
5.6 KiB
Systemverilog
139 lines
5.6 KiB
Systemverilog
// Generated by CIRCT firtool-1.151.0
|
|
module ScratchpadSlavePort(
|
|
input clock,
|
|
reset,
|
|
output auto_in_a_ready,
|
|
input auto_in_a_valid,
|
|
input [2:0] auto_in_a_bits_opcode,
|
|
auto_in_a_bits_param,
|
|
input [1:0] auto_in_a_bits_size,
|
|
input [6:0] auto_in_a_bits_source,
|
|
input [31: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 [6:0] auto_in_d_bits_source,
|
|
output [63:0] auto_in_d_bits_data,
|
|
input io_dmem_req_ready,
|
|
output io_dmem_req_valid,
|
|
output [33:0] io_dmem_req_bits_addr,
|
|
output [4:0] io_dmem_req_bits_cmd,
|
|
output [1:0] io_dmem_req_bits_size,
|
|
output io_dmem_s1_kill,
|
|
output [63:0] io_dmem_s1_data_data,
|
|
output [7:0] io_dmem_s1_data_mask,
|
|
input io_dmem_s2_nack,
|
|
io_dmem_resp_valid,
|
|
input [63:0] io_dmem_resp_bits_data_raw
|
|
);
|
|
|
|
wire [7:0][3:0] _GEN = '{4'h0, 4'h0, 4'h0, 4'h8, 4'hF, 4'hE, 4'hD, 4'hC};
|
|
reg [2:0] state;
|
|
wire _io_dmem_req_bits_T_2 = state == 3'h4;
|
|
reg [2:0] acq_opcode;
|
|
reg [2:0] acq_param;
|
|
reg [1:0] acq_size;
|
|
reg [6:0] acq_source;
|
|
reg [31:0] acq_address;
|
|
reg [7:0] acq_mask;
|
|
reg [63:0] acq_data;
|
|
wire _ready_T = state == 3'h0;
|
|
wire _nodeIn_d_bits_data_T = state == 3'h2;
|
|
wire ready =
|
|
_ready_T | _nodeIn_d_bits_data_T & io_dmem_resp_valid & auto_in_d_ready;
|
|
wire _io_dmem_req_bits_T = state == 3'h3;
|
|
wire nodeIn_a_ready = io_dmem_req_ready & ready;
|
|
wire [2:0] _io_dmem_req_bits_T_1_opcode =
|
|
_io_dmem_req_bits_T ? acq_opcode : auto_in_a_bits_opcode;
|
|
wire [2:0] _io_dmem_req_bits_T_1_param =
|
|
_io_dmem_req_bits_T ? acq_param : auto_in_a_bits_param;
|
|
wire [1:0] io_dmem_req_bits_size_0 =
|
|
_io_dmem_req_bits_T ? acq_size : auto_in_a_bits_size;
|
|
wire [31:0] _io_dmem_req_bits_T_1_address =
|
|
_io_dmem_req_bits_T ? acq_address : auto_in_a_bits_address;
|
|
wire _io_dmem_req_bits_T_3 = _io_dmem_req_bits_T_1_opcode == 3'h1;
|
|
wire [1:0] _io_dmem_req_bits_mask_full_desired_mask_T =
|
|
{_io_dmem_req_bits_T_1_address[0] | (|io_dmem_req_bits_size_0),
|
|
~(_io_dmem_req_bits_T_1_address[0])};
|
|
wire [3:0] _io_dmem_req_bits_mask_full_desired_mask_T_1 =
|
|
{(_io_dmem_req_bits_T_1_address[1]
|
|
? _io_dmem_req_bits_mask_full_desired_mask_T
|
|
: 2'h0) | {2{io_dmem_req_bits_size_0[1]}},
|
|
_io_dmem_req_bits_T_1_address[1]
|
|
? 2'h0
|
|
: _io_dmem_req_bits_mask_full_desired_mask_T};
|
|
wire nodeIn_d_valid = io_dmem_resp_valid | state == 3'h5;
|
|
reg [63:0] nodeIn_d_bits_data_r;
|
|
always @(posedge clock) begin
|
|
if (reset)
|
|
state <= 3'h4;
|
|
else if ((auto_in_a_valid & ready | _io_dmem_req_bits_T) & io_dmem_req_ready)
|
|
state <= 3'h1;
|
|
else if (io_dmem_s2_nack)
|
|
state <= 3'h3;
|
|
else if (auto_in_d_ready & nodeIn_d_valid)
|
|
state <= 3'h0;
|
|
else if (io_dmem_resp_valid)
|
|
state <= 3'h5;
|
|
else if (_io_dmem_req_bits_T_2 & auto_in_a_valid)
|
|
state <= 3'h0;
|
|
else if (state == 3'h1)
|
|
state <= 3'h2;
|
|
if (nodeIn_a_ready & auto_in_a_valid) begin
|
|
acq_opcode <= auto_in_a_bits_opcode;
|
|
acq_param <= auto_in_a_bits_param;
|
|
acq_size <= auto_in_a_bits_size;
|
|
acq_source <= auto_in_a_bits_source;
|
|
acq_address <= auto_in_a_bits_address;
|
|
acq_mask <= auto_in_a_bits_mask;
|
|
acq_data <= auto_in_a_bits_data;
|
|
end
|
|
if (_nodeIn_d_bits_data_T)
|
|
nodeIn_d_bits_data_r <= io_dmem_resp_bits_data_raw;
|
|
end // always @(posedge)
|
|
assign auto_in_a_ready = nodeIn_a_ready;
|
|
assign auto_in_d_valid = nodeIn_d_valid;
|
|
assign auto_in_d_bits_opcode = {2'h0, ~(acq_opcode == 3'h0 | acq_opcode == 3'h1)};
|
|
assign auto_in_d_bits_size = acq_size;
|
|
assign auto_in_d_bits_source = acq_source;
|
|
assign auto_in_d_bits_data =
|
|
_nodeIn_d_bits_data_T ? io_dmem_resp_bits_data_raw : nodeIn_d_bits_data_r;
|
|
assign io_dmem_req_valid =
|
|
auto_in_a_valid & (_ready_T | _nodeIn_d_bits_data_T) | _io_dmem_req_bits_T;
|
|
assign io_dmem_req_bits_addr = {2'h0, _io_dmem_req_bits_T_1_address};
|
|
assign io_dmem_req_bits_cmd =
|
|
_io_dmem_req_bits_T_2 | _io_dmem_req_bits_T_3
|
|
& (&((_io_dmem_req_bits_T ? acq_mask : auto_in_a_bits_mask)
|
|
| ~{(_io_dmem_req_bits_T_1_address[2]
|
|
? _io_dmem_req_bits_mask_full_desired_mask_T_1
|
|
: 4'h0) | {4{&io_dmem_req_bits_size_0}},
|
|
_io_dmem_req_bits_T_1_address[2]
|
|
? 4'h0
|
|
: _io_dmem_req_bits_mask_full_desired_mask_T_1}))
|
|
? 5'h1
|
|
: _io_dmem_req_bits_T_1_opcode == 3'h4
|
|
? 5'h0
|
|
: _io_dmem_req_bits_T_1_opcode == 3'h3
|
|
? {1'h0,
|
|
_io_dmem_req_bits_T_1_param == 3'h3
|
|
? 4'h4
|
|
: _io_dmem_req_bits_T_1_param == 3'h2
|
|
? 4'hB
|
|
: _io_dmem_req_bits_T_1_param == 3'h1
|
|
? 4'hA
|
|
: _io_dmem_req_bits_T_1_param == 3'h0 ? 4'h9 : 4'h0}
|
|
: _io_dmem_req_bits_T_1_opcode == 3'h2
|
|
? {1'h0, _GEN[_io_dmem_req_bits_T_1_param]}
|
|
: _io_dmem_req_bits_T_3
|
|
? 5'h11
|
|
: {4'h0, _io_dmem_req_bits_T_1_opcode == 3'h0};
|
|
assign io_dmem_req_bits_size = io_dmem_req_bits_size_0;
|
|
assign io_dmem_s1_kill = state != 3'h1;
|
|
assign io_dmem_s1_data_data = acq_data;
|
|
assign io_dmem_s1_data_mask = acq_mask;
|
|
endmodule
|
|
|