/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ module VTAMemDPI # ( parameter LEN_BITS = 8, parameter ADDR_BITS = 64, parameter DATA_BITS = 64 ) ( input clock, input reset, input dpi_req_valid, input dpi_req_opcode, input [LEN_BITS-1:0] dpi_req_len, input [ADDR_BITS-1:0] dpi_req_addr, input dpi_wr_valid, input [DATA_BITS-1:0] dpi_wr_bits, output logic dpi_rd_valid, output logic [DATA_BITS-1:0] dpi_rd_bits, input dpi_rd_ready ); import "DPI-C" function void VTAMemDPI ( input byte unsigned req_valid, input byte unsigned req_opcode, input byte unsigned req_len, input longint unsigned req_addr, input byte unsigned wr_valid, input longint unsigned wr_value, output byte unsigned rd_valid, output longint unsigned rd_value, input byte unsigned rd_ready ); typedef logic dpi1_t; typedef logic [7:0] dpi8_t; typedef logic [31:0] dpi32_t; typedef logic [63:0] dpi64_t; dpi1_t __reset; dpi8_t __req_valid; dpi8_t __req_opcode; dpi8_t __req_len; dpi64_t __req_addr; dpi8_t __wr_valid; dpi64_t __wr_value; dpi8_t __rd_valid; dpi64_t __rd_value; dpi8_t __rd_ready; always_ff @(posedge clock) begin __reset <= reset; end // delaying outputs by one-cycle // since verilator does not support delays always_ff @(posedge clock) begin dpi_rd_valid <= dpi1_t ' (__rd_valid); dpi_rd_bits <= __rd_value; end assign __req_valid = dpi8_t ' (dpi_req_valid); assign __req_opcode = dpi8_t ' (dpi_req_opcode); assign __req_len = dpi_req_len; assign __req_addr = dpi_req_addr; assign __wr_valid = dpi8_t ' (dpi_wr_valid); assign __wr_value = dpi_wr_bits; assign __rd_ready = dpi8_t ' (dpi_rd_ready); // evaluate DPI function always_ff @(posedge clock) begin if (reset | __reset) begin __rd_valid = 0; __rd_value = 0; end else begin VTAMemDPI( __req_valid, __req_opcode, __req_len, __req_addr, __wr_valid, __wr_value, __rd_valid, __rd_value, __rd_ready); end end endmodule