Files
b210-k7-fpga/top/x400/dboards/zbx/cpld/register_endpoints/basic_regs.v
T
Humberto Jimenez 4082066a6f fpga: x400: Refactor CPLDs build process
This commit refactors the X410's CPLDs build process to make it similar to other
FPGA targets within the repo. The new process relies on basic Quartus build
utilities.
Additionally, this commit adds support for an alternative MAX10 CPLD for the
motherboard CPLD implementation. Both previous (10M04) and new variant
(10M08) are supported concurrently. The images package mapping is updated to
reflect these changes.


Original-commit: e1ce4565dbc7336ee806adce7c087bda4fcc77ae
2021-12-01 10:51:07 -06:00

220 lines
7.1 KiB
Verilog

//
// Copyright 2021 Ettus Research, a National Instruments Brand
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
// Module: basic_regs
//
// Description:
// Basic Registers to inform software about version and capabilities.
//
`default_nettype none
module basic_regs #(
parameter [19:0] BASE_ADDRESS = 0,
parameter [19:0] SIZE_ADDRESS = 0
) (
// Request
input wire s_ctrlport_req_wr,
input wire s_ctrlport_req_rd,
input wire [19:0] s_ctrlport_req_addr,
input wire [31:0] s_ctrlport_req_data,
// Response
output reg s_ctrlport_resp_ack,
output reg [ 1:0] s_ctrlport_resp_status,
output reg [31:0] s_ctrlport_resp_data,
//reg clk domain
input wire ctrlport_clk,
input wire ctrlport_rst
);
`include "../regmap/basic_regs_regmap_utils.vh"
`include "../../../../../../lib/rfnoc/core/ctrlport.vh"
//----------------------------------------------------------
// Internal registers
//----------------------------------------------------------
reg [SCRATCH_REG_SIZE-1:0] scratch_reg = {SCRATCH_REG_SIZE {1'b0}};
//----------------------------------------------------------
// Handling of CtrlPort
//----------------------------------------------------------
wire address_in_range = (s_ctrlport_req_addr >= BASE_ADDRESS) && (s_ctrlport_req_addr < BASE_ADDRESS + SIZE_ADDRESS);
always @(posedge ctrlport_clk) begin
// reset internal registers and responses
if (ctrlport_rst) begin
scratch_reg <= {SCRATCH_REG_SIZE {1'b0}};
s_ctrlport_resp_ack <= 1'b0;
s_ctrlport_resp_data <= {32{1'bx}};
s_ctrlport_resp_status <= CTRL_STS_OKAY;
end else begin
// write requests
if (s_ctrlport_req_wr) begin
// always issue an ack and no data
s_ctrlport_resp_ack <= 1'b1;
s_ctrlport_resp_data <= {32{1'bx}};
s_ctrlport_resp_status <= CTRL_STS_OKAY;
case (s_ctrlport_req_addr)
BASE_ADDRESS + SLAVE_SCRATCH: begin
scratch_reg <= s_ctrlport_req_data[ SCRATCH_REG_MSB : SCRATCH_REG];
end
// error on undefined address
default: begin
if (address_in_range) begin
s_ctrlport_resp_status <= CTRL_STS_CMDERR;
// no response if out of range
end else begin
s_ctrlport_resp_ack <= 1'b0;
end
end
endcase
// read requests
end else if (s_ctrlport_req_rd) begin
// default assumption: valid request
s_ctrlport_resp_ack <= 1'b1;
s_ctrlport_resp_status <= CTRL_STS_OKAY;
s_ctrlport_resp_data <= {32{1'b0}};
case (s_ctrlport_req_addr)
BASE_ADDRESS + SLAVE_SIGNATURE: begin
s_ctrlport_resp_data[BOARD_ID_MSB : BOARD_ID]
<= BOARD_ID_VALUE[BOARD_ID_SIZE-1:0];
end
BASE_ADDRESS + SLAVE_REVISION: begin
s_ctrlport_resp_data[REVISION_REG_MSB : REVISION_REG]
<= CPLD_REVISION[REVISION_REG_SIZE-1:0];
end
BASE_ADDRESS + SLAVE_OLDEST_REVISION: begin
s_ctrlport_resp_data[OLDEST_REVISION_REG_MSB : OLDEST_REVISION_REG]
<= OLDEST_CPLD_REVISION[OLDEST_REVISION_REG_SIZE-1:0];
end
BASE_ADDRESS + SLAVE_SCRATCH: begin
s_ctrlport_resp_data[SCRATCH_REG_MSB : SCRATCH_REG] <= scratch_reg;
end
BASE_ADDRESS + GIT_HASH_REGISTER: begin
`ifdef GIT_HASH
s_ctrlport_resp_data <= `GIT_HASH;
`else
s_ctrlport_resp_data <= 32'hDEADBEEF;
`endif
end
// error on undefined address
default: begin
s_ctrlport_resp_data <= {32{1'b0}};
if (address_in_range) begin
s_ctrlport_resp_status <= CTRL_STS_CMDERR;
// no response if out of range
end else begin
s_ctrlport_resp_ack <= 1'b0;
end
end
endcase
// no request
end else begin
s_ctrlport_resp_ack <= 1'b0;
end
end
end
endmodule
`default_nettype wire
//XmlParse xml_on
//<regmap name="BASIC_REGS_REGMAP" readablestrobes="false" generatevhdl="true" ettusguidelines="true">
// <group name="BASIC_REGS_REGISTERS" size="0x010">
// <info>
// This regmap contains the revision registers, signature register, a scratch register, and a slave control reg.
// </info>
//
// <enumeratedtype name="BASIC_REGISTERS_VALUES" showhexvalue="true">
// <info>
// This enum is used to create the constants held in the basic registers in both verilog and vhdl.
// </info>
// <value name="BOARD_ID_VALUE" integer="0x4002"/>
// <value name="CPLD_REVISION" integer="0x21111614"/>
// <value name="OLDEST_CPLD_REVISION" integer="0x20110611"/>
// </enumeratedtype>
//
// <register name="SLAVE_SIGNATURE" size="32" offset="0x00" attributes="Readable">
// <info>
// This register contains the unique signature of the DB. This signature is the same value as the one
// stored on the board ID EEPROM
// </info>
// <bitfield name="BOARD_ID" range="15..0" type="integer">
// <info>
// Board ID corresponds to the las 16 digits of the daughterboard part number.
// </info>
// </bitfield>
// </register>
//
// <register name="SLAVE_REVISION" size="32" offset="0x04" attributes="Readable">
// <info>
// This register contains the revision number of the current build
// </info>
// <bitfield name="REVISION_REG" range="31..0" type="integer">
// <info>
// Returns the revision in YYMMDDHH format
// </info>
// </bitfield>
// </register>
//
// <register name="SLAVE_OLDEST_REVISION" size="32" offset="0x08" attributes="Readable">
// <info>
// This register contains the revision number of the oldest compatible revision
// </info>
// <bitfield name="OLDEST_REVISION_REG" range="31..0" type="integer">
// <info>
// Returns the oldest compatible revision in YYMMDDHH format
// </info>
// </bitfield>
// </register>
//
// <register name="SLAVE_SCRATCH" size="32" offset="0x0C" attributes="Readable|Writable">
// <info>
// Read/write scratch register
// </info>
// <bitfield name="SCRATCH_REG" range="31..0" initialvalue="0">
// <info>
// Returns the value written here previously.
// </info>
// </bitfield>
// </register>
//
// <register name="GIT_HASH_REGISTER" offset="0x10" size="32" writable="false">
// <info>
// Git hash of commit used to build this image.{br}
// Value equals 0xDEADBEEF if the git hash was not used during synthesis.
// </info>
// <bitfield name="GIT_CLEAN" range="31..28">
// <info>
// 0x0 in case the git status was clean{br}
// 0xF in case there were uncommitted changes
// </info>
// </bitfield>
// <bitfield name="GIT_HASH" range="27..0">
// <info>7 hex digit hash code of the commit</info>
// </bitfield>
// </register>
// </group>
//</regmap>
//XmlParse xml_off