Speedster7t、GDDR6、高端FPGA、NAP响应器模块、AXI
引言
本 GDDR6 参考设计展示了对 Speedster®7t 系列 FPGA 的所有 GDDR6 子系统执行读写事务的能力。本指南详细介绍了通过综合流程以及 ACE 工具的布局布线流程,在多款器件上实现该设计的方法。 Speedster7t AC7t1400 和 AC7t1500 FPGA 各配备 8 个 GDDR6 子系统和 16 个通道,而 Speedster7t AC7t800 则拥有 3 个 GDDR6 子系统和 6 个通道(更多细节请参阅《Speedster7t GDDR6 用户指南》(UG091))。 注:本次发布的 GDDR6 参考设计,其支持的设计文件仅面向 VectorPath 815 加速卡上的 AC7t1500 器件。因此,本文档仅介绍该设计的 AC7t1500 适配版本。
在 Speedster7t AC7t1400 和 AC7t1500 FPGA 上,可通过二维片上网络(2D NoC)接口或直连(DC)接口对 GDDR6 子系统执行事务操作。本设计可用于测试每个 GDDR6 子系统的两个通道,也可通过修改扩展设计,实现对 8 个 GDDR6 子系统的全部 16 个通道的测试。 本设计通过仿真验证了从可编程逻辑区的 NAP 或 DC 接口端口,到 GDDR6 存储器之间的接口交互。 由本设计生成的比特流以及附带的运行时脚本,均与 VectorPath 815 加速卡兼容。
设计描述
本设计包含以下逻辑模块和接口:
Achronix设备管理器
GDDR6参考设计使用ACX_DEVICE_MANAGER软核IP,为AC7t1400和AC7t1500 FPGA的GDDR6子系统执行训练流程。当锁相环(PLL)完成锁相后,复位信号释放并启动训练过程。该模块32位输出信号o_status的最低两位置高时,表示训练过程完成。运行时脚本会通过这些状态位,确保GDDR6训练完成后,再向GDDR6存储器发起事务操作。有关该软核IP的更多信息,请参阅《Speedster7t软核IP用户指南》(UG103)。
NAP响应器模块
NAP响应器用于在GDDR6存储器与可编程逻辑区的AXI存储通道逻辑之间传输数据。本设计启用了全部8个GDDR6子系统,但并未使用每个子系统的所有通道。设计采用2D NoC接口,对接所有子系统的1通道。每个GDDR6接口都配有对应的AXI存储通道逻辑模块,该模块在设计中充当数据生成器和校验器。在仿真和ACE布局过程中,每个NAP均可绑定到任意位置,这种灵活性支持多种测试场景,验证GDDR6子系统能否处理来自可编程逻辑区任意NAP的事务请求。
NAP位置
针对本VectorPath 815参考设计,NAP的位置选择在FPGA东侧或西侧,且与目标GDDR6子系统相邻的区域(选择距离目标子系统更近的一侧)。该布局方式旨在减少NAP与GDDR6控制器之间的延迟。设计所使用的8个NAP分布在列3和列8的第3、4、5、6行,其位置在/src/tb/tb_gddr_ref_design.sv和/src/constraints/ace_placements.pdc文件中均有定义。通过统一仿真和实际实现流程中的布局,可确保两种流程的结果实现最精准的关联。
直连(DC)接口
直连(DC)接口是一种信号接口,可实现可编程逻辑区与子系统的直接连接。本设计中,DC接口用于子系统1、2、5、6的0通道,将GDDR6子系统的DC接口信号与AXI存储通道相连,实现对GDDR6存储器的直接访问。通过GDDR6 DC接口,设计无需通过NAP在NoC上传输事务,即可访问GDDR6存储器,这有助于减少NoC上的流量并节省NAP资源。
DC接口逻辑位置
与GDDR6 DC接口交互的AXI存储通道逻辑,可放置在FPGA可编程逻辑区的任意位置,本参考设计中未对其施加约束。但为了实现DC接口与用户设计之间更优的时序收敛,该逻辑通常会自然布局在FPGA可编程逻辑区东侧或西侧的DC接口端口附近(根据目标GDDR6子系统的位置确定)。
AXI存储通道
本设计实例化了12个AXI存储通道,每个存储通道生成AXI数据包向GDDR6子系统写入数据,并回读数据以验证每个事务是否被正确处理。设计中的每个GDDR6接口均配有一个存储通道,因此共有8个通道与NAP相连,4个通道与DC接口引脚相连。
AXI存储通道集成了AXI数据包生成器、LRAM FIFO、AXI数据包校验器和AXI性能监视器,这些组件共同构成一个存储测试通道。通过该模块,数据包被生成并通过AXI接口发送至存储接口进行处理,同时这些数据包会通过同一AXI接口回传,与发送的数据进行比对,以验证存储接口的功能。
一组寄存器被接入测试模块,用于配置和监控通道,该寄存器组直接与寄存器控制块相连。
参数
表1 • AXI存储通道参数
| AXI_DATA_WIDTH | 256 | AXI interface data width. |
| AXI_ADDR_WIDTH | 42 | AXI interface address width. |
| LINEAR_PKTS | 0 | Set to 1 to make packets have linear counts. |
| LINEAR_ADDR | 0 | Set to 1 to have linear addresses. |
| MAX_BURST_LEN | 0 | Maximum number of AXI packets in a burst. |
| TGT_ADDR_WIDTH | 0 | Target address width. |
| TGT_ADDR_PAD_WIDTH | 0 | Target address padding. |
| TGT_ADDR_ID | 0 | Target address ID. |
| RAND_DATA_INIT | 0 | Random value for data starting point. |
| NO_AR_LIMIT | 0 | Minimum gap to prevent GDDR/DDR pipeline reordering. |
| NUM_REGS | 8 | Number of read and write registers used in the channel. |
| CHANNEL_CLK_FREQ | 400 | Frequency of channel clock, also used to calibrate performance monitor. |
| OUTPUT_PIPELINE_LENGTH | 4 | Length of output pipeline. |
端口
表2 • AXI存储通道端口
| i_ch_clk | 1 | Input | Channel clock. |
| i_reg_clk | 1 | Input | Register clock. Must match the register_control_block clock. |
| i_ch_reset_n | 1 | Input | Negative reset on channel clock. |
| i_regs_write | 32x NUM_REGS | Input | Array of registers to configure channels. |
| axi_if | Input/Output | AXI4 interface. | |
| o_regs_read | 32x NUM_REGS | Output | Array of registers to monitor channel. |
| o_running | 1 | Output | Indicates test is running. |
| o_done | 1 | Output | Indicates test is complete. |
| o_fail | 1 | Output | Indicates test has failed. |
寄存器
每个存储通道使用11个寄存器进行配置和监控,仅寄存器0和2可通过寄存器控制块写入,其余所有寄存器均为只读。下表列出了各寄存器及其功能。
表3 • 控制寄存器(CONTROL_REG)(偏移地址:0x00_0000)
| gen_rstn_pre | 0 | RW | 1’b0 | Packet generator reset. |
| chk_rstn_pre | 1 | RW | 1’b0 | Packet checker reset. |
| fifo_rstn_pre | 2 | RW | 1’be | FIFO reset. |
| mon_rstn_pre | 3 | RW | 1’be | Performance monitor reset. |
| fifo_flush_pre | 4 | RW | 1’b0 | Flushes the FIFO. |
| max_bursts_pre | 5 | RW | 1’be | Determines whether the AXI packet generator creates maximum length packets ( 1’b1) or variable length packets ( 1’b0). |
| gen_start_pre | 6 | RW | 1’b0 | Start packet generator. |
| [31:7] | RO | 25’b0 | Reserved. |
表注:t 上述信号通过寄存器控制块时钟采样后,同步至通道时钟域。
表4 • 状态寄存器(STATUS_REG)(偏移地址:0x00_0004)
| test_running | 0 | RO | 1’b0 | Asserted when transactions are still running. |
| test_done | 1 | RO | 1’b0 | Asserted when transactions are complete. |
| gen_running | 2 | RO | 1’b0 | Asserted when transactions are still running. |
| gen_done | 3 | RO | 1’b0 | Asserted when transactions are complete. |
| pkt_error | 4 | RO | 1’b0 | Asserted when a packet mismatch occurs. |
| wr_error | 5 | RO | 1’b0 | Asserted when a writing error occurs. |
| [7:6] | RO | 2’b0 | Reserved. | |
| outstanding_compares | [15:8] | RO | 8’b0 | 8-bit number comparing transactions read against transactions compared. |
| [31:16] | RO | 16’b0 | Reserved. |
表5 • 事务数寄存器(NUM_TRANSFERS_REG)(偏移地址:0x00_0008)
| num_transfers_reg | [31:0] | RW | 32’b0 | Sets number of transactions to run during test. Performs continuous transactions if set to 0. |
表6 • 测试生成计数寄存器(TEST_GEN_COUNT)(偏移地址:0x00_000C)
| test_gen_count | [31:0] | RO | 32’b0 | Stores number of remaining transactions to run in test. |
表7 • 读带宽结果寄存器(BW_RESULTS_RD)(偏移地址:0x00_0010)
| rd_bw_min_norm | [9:0] | RO | 10’b0 | Minimum read bandwidth. |
| rd_bw_max_norm | [19:10] | RO | 10’b0 | Maximum read bandwidth. |
| rd_bw_norm | [29:20] | RO | 10’b0 | Average read bandwidth. |
| [31:30] | RO | 2’b0 | Reserved. |
表8 • 写带宽结果寄存器(BW_RESULTS_WR)(偏移地址:0x00_0014)
| wr_bw_min_norm | [9:0] | RO | 10’b0 | Minimum write bandwidth. |
| wr_bw_max_norm | [19:10] | RO | 10’b0 | Maximum write bandwidth. |
| wr_bw_norm | [29:20] | RO | 10’b0 | Average write bandwidth. |
| [31:30] | RO | 2’b0 | Reserved. |
表9 • 实时延迟结果寄存器(LATENCY_RESULTS_CURRENT)(偏移地址:0x00_0018)
| latency_counter_write | [11:0] | RO | 12’b0 | Latest write latency. |
| [15:12] | RO | 4’b0 | Reserved. | |
| latency_counter_read | [27:16] | RO | 12’b0 | Latest read latency. |
| [31:28] | RO | 4’b0 | Reserved. |
表10 • 平均延迟结果寄存器(LATENCY_RESULTS_AVG)(偏移地址:0x00_001C)
| wr_lat_avg | [11:0] | RO | 12’b0 | Average write latency. |
| [15:12] | RO | 4’b0 | Reserved. | |
| rd_lat_avg | [27:16] | RO | 12’b0 | Average read latency. |
| [31:28] | RO | 4’b0 | Reserved. |
表11 • 最大延迟结果寄存器(LATENCY_RESULTS_MAX)(偏移地址:0x00_0020)
| wr_lat_max | [11:0] | RO | 12’b0 | Maximum write latency. |
| [15:12] | RO | 4’b0 | Reserved. | |
| rd_lat_max | [27:16] | RO | 12’b0 | Maximum read latency. |
| [31:28] | RO | 4’b0 | Reserved. |
表12 • 最小延迟结果寄存器(LATENCY_RESULTS_MIN)(偏移地址:0x00_0024)
| wr_lat_min | [11:0] | RO | 12’b0 | Minimum write latency. |
| [15:12] | RO | 4’b0 | Reserved. | |
| rd_lat_min | [27:16] | RO | 12’b0 | Minimum read latency. |
| [31:28] | RO | 4’b0 | Reserved. |
表13 • 时钟频率与数据位宽寄存器(CLOCK_FREQUENCY_DATA_WIDTH)(偏移地址:0x00_0028)
| data_width | [15:0] | RO | 16’b0 | AXl data bus width. |
| clock_frequency | [29:16] | RO | 14’b0 | Clock frequency in MHz. |
| [31:30] | RO | 2’b0 | Reserved. |
AXI数据包生成器
AXI数据生成器模块生成具有不同突发长度和存储地址的AXI4事务,通过AXI4接口,生成的数据和地址可采用顺序或随机形式,指向顺序或随机地址。 该生成器可配置为适配NAP或DCI连接的存储子系统,其输出可存储在FIFO中,供后续AXI数据包校验器进行校验。
参数
表14 • AXI数据包生成器参数
| LINEAR_PKTS | 0 | Set to 1 for packets with linear counts. |
| LINEAR_ADDR | 0 | Set to 1 for linear addresses. |
| TGT_ADDR_WIDTH | 0 | Target address width. |
| TGT_ADDR_PAD_WIDTH | 0 | Target address padding. |
| TGT_ADDR_ID | 0 | Target address ID. |
| TGT_DATA_WIDTH | 0 | Target data width. |
| MAX_BURST_LEN | 0 | Maximum number of AXl packets in a burst. |
| AXI_ADDR_WIDTH | 0 | Width of axi_if address field. |
| RAND_DATA INIT | 0 | Random value for data starting point. |
端口
表15 • AXI数据包生成器端口
| i_clk | 1 | Input | Input clock. |
| i_reset_n | 1 | Input | Negative synchronous reset. |
| i_start | 1 | Input | Start sequence when applied. |
| i_enable | 1 | Input | Generate new packet when set. |
| i_max_burst | 1 | Input | Generate bursts of size MAX_BURST_LEN when set, otherwise increment bursts from 0 to MAX_BURST_LEN . |
| axi_if | – | Input/Output | AXI4 interface. |
| o_wr_error | 1 | Output | Set when a writing error occurs. |
| o_addr_written | TGT_ADDR_WIDTH | Output | AXI write address output. |
| o_len_written | 8 | Output | Applied to data written into FIFO for checking algorithm. |
| o_written_valid | 1 | Output | Set high when data is successfully written from generator. |
AXI数据包校验器
AXI数据包校验器从FIFO中读取数据包地址和长度,然后从指定地址执行读操作,并将接收的数据与内部随机数生成器生成的数据进行比对(该内部生成器与配套的AXI数据包生成器的随机数生成器序列一致)。若读数据与预期数据匹配,校验器指示存储事务成功;若存在不匹配,o_pkt_error信号置高,指示事务失败。
参数
表16 • AXI数据包校验器参数
| LINEAR_PKTS | 0 | Set to 1 for packets with linear counts. |
| TGT_ADDR_WIDTH | 0 | Target address width. |
| TGT_ADDR_PAD_WIDTH | 0 | Target address padding. |
| TGT_ADDR_ID | 0 | Target address ID. |
| TGT_DATA_WIDTH | 0 | Target data width. |
| AXI_ADDR_WIDTH | 0 | Width of axi_if address field. |
| RAND_DATA_INIT | 0 | Random value for data starting point. |
| NO_AR_LIMIT | 0 | Gap to prevent GDDR/DDR pipeline reordering. |
端口
表17 • AXI数据包校验器端口
| i_clk | 1 | Input | Input clock. |
| i_reset_n | 1 | Input | Negative synchronous reset. |
| i_xact_avail | 1 | Input | Asserted when a transaction is available to read. |
| i_xact_addr | TGT_ADDR_WIDTH | Input | Packet address received from FIFO. |
| i_xact_len | 8 | Input | Packet length received from FIFO. |
| axi_if | – | Input/Output | AXI interface. |
| o_xact_read | 1 | Output | Asserted when data is ready to be read. |
| o_pkt_compared | 1 | Output | Asserted at the end of each packet comparison. |
| o_pkt_error | 1 | Output | Asserted if a packet mismatch occurs. |
AXI性能监视器
AXI性能监视器用于测量各AXI接口的读写数据速率和延迟,可在可定义的采样窗口内,基于AXI数据字级别计算读写带宽的移动平均值。
此外,监视器还能基于可定义的事务数量,计算平均读写延迟,并测量带宽和延迟的最小值与最大值,且可直接与寄存器控制块相连。
工作模式
监视器支持多种工作模式:
手动启动和停止:需置位i_start和i_stop信号以启动和停止性能测量,测量结束后,结果反映带宽(BW)的变化情况;
自动启动:接收到第一个AXI读数据后启动测量,停止仍需手动置位i_stop;
自动停止:手动启动测量,达到预定义的时钟周期数后自动停止;
全自动:接收到第一个AXI读数据后启动测量,达到定义的时钟周期数后自动停止。
参数
表18 • AXI性能监视器参数
| BW_WINDOW_SIZE | 2048 | Size of the moving window for the bandwidth calculation. Maximum of 2048 used as default. Power of 2 number <= 2048. |
| LAT_AVERAGE_SIZE_EXP | 5 | Quantity of the transactions used to calculate the average latency. The number of samples averaged is (2 ^ LAT_AVERAGE_SIZE_EXP) . |
| STOP_COUNT | 0 | If non-zero, stop measuring on this number of cycles. Ignore i_stop . Within the range of [0–2^15 – 1] |
| AUTO_START | 0 | If enabled, start counting when first read word is received. Ignore i_start . |
| CLOCK_FREQ | 500 | Operating clock frequency of the AXI interface in MHz. This value gets propagated to the register interface. Eases the computation of latency and bandwidth. |
| DATA_WIDTH | 32 | Data width of the AXI interface in bytes. This value gets propagated to the register interface. Eases the computation of bandwidth. |
端口
表19 • AXI性能监视器端口
| i_clk | 1 | Input | Clock input. Must be assigned to axi_if master clock. |
| i_reset_n | 1 | Input | Negative synchronous reset. |
| i_start | 1 | Input | Assert to start the performance measurement. |
| i_stop | 1 | Input | Assert to stop the performance measurement. |
| i_counter_reset | 1 | Input | Assert to reset the performance counters. |
| axi_if | Input | Direct connection to AXI interface signals in monitor mode. | |
| o_bw_results_rd | 32 | Output | A combined 32-bit word that contains average, max and min read bandwidth: [31:30] – reserved. Returns 2’b0. [29:20] – average read bandwidth. [19:10] – maximum read bandwidth. [9:0] – minimum read bandwidth. |
| o_bw_results_wr | 32 | Output | A combined 32-bit word that contains average, max and min write bandwidth: [31:30] – reserved. Returns 2’b0. [29:20] – average write bandwidth. [19:10] – maximum write bandwidth. [9:0] – minimum write bandwidth. |
| o_latency_results_current | 32 | Output | A combined 32 bit word measuring the read and write latency of the latest transactions: [31:28] – reserved. Returns 4’b0. [27:16] -latest read latency. [15:12] – reserved. Returns 4’b0. [11:0] -latest write latency. |
| o_latency_results_avg | 32 | Output | A combined 32-bit word measuring average read and write latency: [31:28] – reserved, returns 4’b0. [27:16] – average read latency. [15:12] – reserved, returns 4’b0. [11:0] – average write latency. |
| o_latency_results_max | 32 | Output | A combined 32-bit word measuring maximum read and write latency: [31:28] – reserved, returns 4’b0. [27:16] – maximum read latency. [15:12] – reserved, returns 4’b0. [11:0] – maximum write latency. |
| o_latency_results_min | 32 | Output | A combined 32-bit word measuring minimum read and write latency: [31:28] – reserved, returns 4’b0. [27:16] – minimum read latency. [15:12] – reserved, returns 4’b0. [11:0] – minimum write latency. |
| o_clock_freq_data_width | 32 | Output | A combined 32-bit word that reports the clock frequency and the data width of the AXl port: [31:30] – 2’b00 .Indicates AXl performance monitor. [29:16] – clock frequency in MHz. Equivalent to CLOCK_FREQ. [15:0] – AXI data bus width. Equivalent to DATA_WIDTH. This register is intended to allow software to automatically calculate the bandwidth and latency values without requiring access to the RTL source. |
表注:* 数值均归一化为10位值(最大值1024)。
计算公式
计算带宽(MB/s)可使用以下公式:
- 带宽(字节/秒)= (o_bw_results_XX / 1024) × (CLOCK_FREQ × AXI_DATA_WIDTH)
计算延迟(ns)可使用以下公式:
- 延迟(ns)= o_latency_results_YY × 1000 / CLOCK_FREQ
时钟域考量
所有输入和输出信号均与时钟输入i_clk同步,i_clk必须连接到驱动axi_if的AXI接口时钟。
AXI性能监视器通常直接与寄存器控制块相连,这种情况下需考虑监视器与寄存器块之间的多时钟域问题,建议采用以下方法确保读取结果寄存器时的数据完整性:
将寄存器控制块连接到与i_clk相同的时钟。但在许多设计中,若寄存器控制块需控制设计的多个功能,或出于时序收敛的考虑,这种方式可能并不适用;
使用i_start和i_stop启动和停止测量,在置位i_stop后,待输出结果寄存器稳定后再读取结果(本参考设计采用此方法);
在所有AXI性能监视器寄存器输出端加入时钟域交叉同步器(ACX_SYNCHRONIZER)(o_clock_freq_data_width为常量,无需添加),这会额外占用6个寄存器×32位×每个同步器2个触发器=384个寄存器。
实例化
本设计包含三个独立模块,AXI性能监视器由两个子模块组成:axi_bw_monitor(执行带宽测量)和axi_lat_monitor(执行延迟测量),这两个子模块在axi_performance_monitor中组合,形成上述的带宽和延迟综合监视器。通常建议实例化完整的axi_performance_monitor,若用户设计需要,也可单独实例化两个子模块。以下示例展示了三个模块的实例化模板:
// Instantiate AXI performance monitor
axi_performance_monitor #(
.BW_WINDOW_SIZE (1024),
.LAT_AVERAGE_SIZE_EXP (5)
.STOP_COUNT (STOP_COUNT),
.AUTO_START (AUTO_START),
.CLOCK_FREQ (CLOCK_FREQ),
.DATA_WIDTH (AXI_DATA_WIDTH)
) i_axi_performance_monitor_nap (
// Inputs
.i_clk (clk),
.i_reset_n (reset_n),
.i_start (start),
.i_stop (stop),
.i_counter_reset (counter_reset),
// Interfaces
.axi_if (axi_if),
// Outputs
.o_bw_results_rd (bw_results_rd),
.o_bw_results_wr (bw_results_wr),
.o_latency_results_current (latency_results_current), .o_latency_results_avg (latency_results_avg),
.o_latency_results_max (latency_results_max),
.o_latency_results_min (latency_results_min),
.o_clock_freq_data_width (clock_freq_data_width)
);
// Instantiate submodule AXI bandwidth monitor
axi_bw_monitor #(
.BW_WINDOW_SIZE (BW_WINDOW_SIZE),
.STOP_COUNT (STOP_COUNT),
.AUTO_START (AUTO_START),
.CLOCK_FREQ (CLOCK_FREQ),
.DATA_WIDTH (DATA_WIDTH)
) i_axi_bw_monitor_nap (
// Inputs
.i_clk (i_clk),
.i_reset_n (i_reset_n),
.i_start (i_start),
.i_stop (i_stop),
.i_counter_reset (i_counter_reset),
// Interfaces
.axi_if (axi_if),
// Outputs
.o_bw_results_rd (bw_results_rd),
.o_bw_results_wr (bw_results_wr),
.o_clock_freq_data_width (clock_freq_data_width)
);
// Instantiate submodule AXI latency monitor
axi_latency_monitor #(
.LAT_AVERAGE_SIZE_EXP (LAT_AVERAGE_SIZE_EXP),
.STOP_COUNT (STOP_COUNT),
.AUTO_START (AUTO_START),
.CLOCK_FREQ (CLOCK_FREQ),
.DATA_WIDTH (DATA_WIDTH)
) i_axi_latency_monitor_nap (
// Inputs
.i_clk (i_clk),
.i_reset_n (i_reset_n),
.i_start (i_start),
.i_stop (i_stop),
.i_counter_reset (i_counter_reset),
// Interfaces
.axi_if (axi_if),
// Outputs
.o_latency_results_current (latency_results_current), .o_latency_results_avg (latency_results_avg),
.o_latency_results_max (latency_results_max),
.o_latency_results_min (latency_results_min),
.o_clock_freq_data_width (clock_freq_data_width) );
寄存器控制块
寄存器控制块在用户设计中创建一组控制和状态寄存器,通过ACX_NAP_AXI_MASTER实现寄存器的读写,NAP可通过PCIe子系统或器件的JTAG端口访问。这些寄存器允许用户在仿真和运行时控制设计功能、读取状态结果并测量性能,块中包含四个固定寄存器(主版本、次版本、补丁版本和修订控制寄存器),可用于多个版本构建的版本管理和可追溯性。
在本参考设计中,寄存器控制块用于启动和停止测试,并确保所有测试通过;此外,在适用的情况下,还可读取流量监视器的数据,测量目标数据路径(尤其是来自硬核接口子系统的数据路径)的吞吐量和延迟。
头文件
reg_control_block.sv文件需要两个头文件,均位于/src/include目录下:
表20 • 寄存器控制块头文件
| reg_control_defines.svh [^t] | Defines the type t_ACX_USER_REGS as a 32-bit logic vector. |
| version_defines.svh | Defines the values of the four fixed-version registers. These values can be used for versioning of the user design. They may be changed on each build to reflect different releases. |
表注:t 寄存器位宽设为32位,按4字节边界寻址。若需要超过32位的寄存器,可并行使用两个寄存器,或修改reg_control_block.sv文件以适配新的位宽和更大的寄存器地址间隔。
参数
表21 • 寄存器控制块参数
| NUM_USER_REGS | 2-1024 | 2 | Number of read and write registers. |
| IN_REGS_PIPE | 0-4 | 0 | Pipeline added to input registers. |
| OUT_REGS_PIPE | 0-4 | 0 | Pipeline added to output registers. |
表注:t 所有支持值的最大值无实际限制,可使用更高的值,但会消耗大量的可编程逻辑区资源。
端口
表22 • 寄存器控制块端口
| i_clk | Input | Clock. |
| i_reset_n | Input | Negative synchronous reset. |
| i_user_regs_in | Input | Array of NUM_USER_REGS of type t_ACX_USER_REGS . |
| o_user_regs_out | Output | Array of NUM_USER_REGS of type t_ACX_USER_REG . |
实例化
以下示例展示了寄存器控制块的实例化:
// Include definitions of register types
`include "reg_control_defines.svh"
// Define number of registers
localparam NUM_USER_REGS = (REGS_PER_ETH_CH*MAX_ETH_CHANNELS)+9;
// Define the registers
t_ACX_USER_REG user_regs_write [NUM_USER_REGS -1:0];
t_ACX_USER_REG user_regs_read [NUM_USER_REGS -1:0];
// Instantiate the register control block
reg_control_block #(
.NUM_USER_REGS (NUM_USER_REGS), // Number of user registers
.IN_REGS_PIPE (2),
.OUT_REGS_PIPE (1)
) i_reg_control_block (
.i_clk (i_reg_clk),
.i_reset_n (reg_rstn),
.i_user_regs_in (user_regs_read),
.o_user_regs_out (user_regs_write)
);
//——————————————————————–
// Make top register a scratch register, looping back on itself
//——————————————————————–
assign user_regs_read[NUM_USER_REGS-1] = user_regs_write[NUM_USER_REGS-1];
寻址
在SystemVerilog代码中,每个寄存器占用一个单独的索引,连续寄存器可通过将索引加1寻址。但从NAP寻址时,由于每个寄存器为4字节宽,连续寄存器位于4字节边界地址,地址间隔为4字节。以下示例展示了寄存器地址的定义:
// Register definition in SystemVerilog
localparam CONTROL_REG_ADDR = 0;
localparam STATUS_REG_ADDR = 1;
localparam NUM_PKTS_TX_REG_ADDR = 2;
localparam SCRATCH_REG_ADDR = NUM_USER_REGS-1;
# Same registers defined in demo Tcl script, (formatted to hex)
set CONTROL_REG_ADDR [format %X [expr {0 * 4}]]
set STATUS_REG_ADDR [format %X [expr {1 * 4}]]
set NUM_PKTS_TX_REG_ADDR [format %X [expr {2 * 4}]]
set SCRATCH_REG_ADDR [format %X [expr {($NUM_USER_REGS-1) * 4}]]
寄存器控制块不支持对寄存器的部分写入,每次事务必须写入全部32位。
演示Tcl脚本
寄存器控制块可用于仿真和运行时,两种场景下驱动寄存器控制块的序列均由位于/demo/scripts/<design_name>_demo.tcl的演示Tcl脚本定义。使用同一源脚本可确保仿真中的操作序列与硬件运行时保持一致,有关演示Tcl脚本格式的详细信息,请参阅《运行时编程脚本》。
访问函数
ACE运行时寄存器库中提供了从ACX_NAP_AXI_MASTER读写的函数,相关文档见《运行时编程脚本》,以下表格详细介绍了三个专用函数:
表23 • 寄存器控制块访问函数
| write <device_namespace>::nap*axi* | NAP_SPACE row col address value | Write a value to a register. |
| read <device_namespace>::nap*axi* | NAP_SPACE row col address | Read a value from a register. Returns a hex value in the range 32’h0 – 32’hffff_ffff . |
| verify <device_namespace>::nap*axi* | NAP_SPACE row col address exp_value | Verify a value from a register. If the verify value is incorrect: In simulation – the FCU BFM asserts an error flag, which can be used in the testbench to indicate test failure. In hardware – the verify function returns an error code (–1) which can be used to issue a fail message. |
表注:t 参数值要求:行为十进制值,范围1–8,必须与测试平台的ACX_BIND语句和/src/constraints/ace_placements.pdc文件中的值一致;列为十进制值,范围1–10,必须与测试平台的ACX_BIND语句和/src/constraints/ace_placements.pdc文件中的值一致;预期值为十六进制值,范围32’h0 – 32’hffff_ffff,不能带0x前缀;地址为十六进制值,范围0–(4 × (NUM_USER_REGS – 1)),为寄存器地址,非NAP地址;值为十六进制值,范围32’h0 – 32’hffff_ffff,可带0x前缀。
仿真
仿真Makefile通过ACE处理演示Tcl脚本,生成仿真命令文件(.txt),该文件写入/sim目录,格式与《器件仿真模型》中展示的“配置文件格式”一致。
测试平台在DSM进入用户模式后读取该文件,并通过DSM FCU将序列施加到ACX_NAP_AXI_MASTER和寄存器阵列,该流程如下图所示:
图1 • 寄存器控制块仿真流程
有关仿真流程的更多细节,请参考仿真参考设计。
运行时JTAG
运行时,演示Tcl脚本在ACE Tcl控制台窗口中读取,并直接施加到连接器件的JTAG端口。运行时,Tcl命令puts和ACE内置命令message均可用于在脚本运行时输出状态信息,该流程如下图所示:
图2 • 寄存器控制块运行时流程
运行时PCIe
寄存器控制块使用的ACX_NAP_AXI_MASTER可通过器件的任意编程方式访问,因此寄存器控制块可通过器件的任意PCIe端口进行访问和控制,有关PCIe驱动的详细信息,请联系Achronix技术支持。
顶层寄存器映射
表24 • Speedster7t AC7t1400和AC7t1500寄存器地址
| GDDR_CONTROL_REG | 0x0000 | [31:0] | RW | Currently not in use. Kept for future control such as resets. |
| GDDR_STATUS_REG_NOC | 0x0004 | [31:0] | RO | Status register for all NAP channels. |
| GDDR_STATUS_REG_DCI | 0x0008 | [31:0] | RO | Status register for all DC interface channels. |
| TRAIN_CONTROL_REG | 0x000C | [31:0] | RO | Status register for GDDR6 training. Connected to ACX_DEVICE_MANAGER status output. |
| NAP_REGS_BASE ( GDDR6_0 ) | 0x0010 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| NAP_REGS_BASE ( GDDR6_1 ) | 0x003C | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| NAP_REGS_BASE ( GDDR6_2 ) | 0x0068 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| NAP_REGS_BASE ( GDDR6_3 ) | 0x0094 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| NAP_REGS_BASE ( GDDR6_4 ) | 0x00C0 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| NAP_REGS_BASE ( GDDR6_5 ) | 0x00EC | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| NAP_REGS_BASE ( GDDR6_6 ) | 0x0118 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| NAP_REGS_BASE ( GDDR6_7 ) | 0x0144 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| DCI_REGS_BASE ( GDDR6_1 ) | 0x0170 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| DCI_REGS_BASE ( GDDR6_2 ) | 0x019C | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| DCI_REGS_BASE ( GDDR6_5 ) | 0x01C8 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| DCI_REGS_BASE ( GDDR6_6 ) | 0x01F4 | – | – | Refer to AXI Memory Channel and corresponding offsets. |
| SCRATCH_REG | 0x0220 | [31:0] | RW | Scratch Register. |
表25 • GDDR_STATUS_REG_NOC寄存器
| pll_lock | 0 | RO | 1’b0 | Set if the PLLs of i_nap_clk are locked. |
| [3:1] | RO | 3’b0 | Reserved. | |
| nap_fail | [11:4] | RO | 8’b0 | Indicates which NAP channels have failed transactions with bit 4 corresponding to GDDR6_0 , bit 5 corresponding to GDDR6_1 , etc. |
| nap_done | [19:12] | RO | 8’b0 | Indicates which NAP channels have completed all of their respective transactions as specified in NUM_TRANSFERS_REG with bit 12 corresponding to GDDR6_0 , bit 13 corresponding to GDDR6_1 , etc. |
| nap_running | [27:20] | RO | 8’b0 | Indicates which NAP channels are still running with bit 20 corresponding to GDDR6_0 , bit 21 corresponding to GDDR6_1 , etc. |
| [31:28] | RO | 4’b0 | Reserved. |
表26 • GDDR_STATUS_REG_DCI寄存器
| pll_gddr_NW_dci_lock | 0 | RO | 1’b0 | Set if the PLL for the west GDDR6 DC interface channels is locked. |
| pll_gddr_NE_dci_lock | 1 | RO | 1’b0 | Set if the PLL for the east GDDR6 DC interface channels is locked. |
| [3:2] | RO | 2’b0 | Reserved. | |
| dci_fail | [7:4] | RO | 4’b0 | Indicates which DC interface channels have failed transactions with bit 4 corresponding to GDDR6_1 , bit 5 corresponding to GDDR6_2 , bit 6 corresponding to GDDR6_5 , and bit 7 corresponding to GDDR6_6 . |
| dci_done | [11:8] | RO | 4’b0 | Indicates which DC interface channels have completed all of their respective transactions as specified in NUM_TRANSFERS_REG with bit 8 corresponding to GDDR6_1 , bit 9 corresponding to GDDR6_2 , bit 10 corresponding to GDDR6_5 , and bit 11 corresponding to GDDR6_6 . |
| dci_running | [15:12] | RO | 4’b0 | Indicates which DC interface channels are still running with bit 12 corresponding to GDDR6_1 , bit 13 corresponding to GDDR6_2 , bit 14 corresponding to GDDR6_5 , and bit 15 corresponding to GDDR6_6 . |
| [31:16] | RO | 16’b0 | Reserved. |
表27 • TRAIN_CONTROL_REG寄存器
| ip_status[0] | 0 | RO | 1’b0 | Set when startup is complete and successful. |
| ip_status[1] | 1 | RO | 1’b0 | Set when startup is complete. |
| [31:2] | RO | 30’b0 | Reserved. |
基于2D NoC-GDDR6接口的测试结构
下图展示了Speedster7t AC7t1400和AC7t1500 FPGA上,AXI存储通道模块通过2D NoC与GDDR6子系统的交互方式。可配置启用2D NoC或DC接口的GDDR6子系统数量,并在顶层模块中设置每个子系统的目标控制器ID。
图3 • Speedster7t AC7t1400和AC7t1500通过2D NoC实现的GDDR6生成器和校验器逻辑
寻址
每个数据包生成器/校验器逻辑块都绑定到一个NAP,以与关联的目标GDDR6子系统交互。下表中的值用于GDDR6的NoC地址方案的控制器ID域,指示每个NAP发送和接收存储事务的目标GDDR6端点,有关NAP地址方案的更多细节,请参阅《Speedster7t 2D片上网络用户指南》(UG089)。
表28 • Speedster7t AC7t1400和AC7t1500的GDDR6子系统控制器ID
| GDDR6_0 Channel 0 | 4’b1100 |
| GDDR6_0 Channel 1 | 4’b1101 |
| GDDR6_1 Channel 0 | 4’b0100 |
| GDDR6_1 Channel 1 | 4’b0101 |
| GDDR6_2 Channel 0 | 4’b0000 |
| GDDR6_2 Channel 1 | 4’b0001 |
| GDDR6_3 Channel 0 | 4’b1000 |
| GDDR6_3 Channel 1 | 4’b1001 |
| GDDR6_4 Channel 0 | 4’b1111 |
| GDDR6_4 Channel 1 | 4’b1110 |
| GDDR6_5 Channel 0 | 4’b0111 |
| GDDR6_5 Channel 1 | 4’b0110 |
| GDDR6_6 Channel 0 | 4’b0011 |
| GDDR6_6 Channel 1 | 4’b0010 |
| GDDR6_7 Channel 0 | 4’b1011 |
| GDDR6_7 Channel 1 | 4’b1010 |
为了根据NoC地址映射构造GDDR6存储地址,这些控制ID值在顶层RTL文件中被定义为GDDR6_ID_NOC_CH1本地参数中的9位值:
// GDDR6 target address ID. Pages are defined in 2D NoC User Guide, Address Mapping
// Defined as 9 bit field. 9th bit(LSB) controls channel selection. All 2D NoC
interfaces are set to channel 1
localparam [71:0] GDDR6_ID_NOC_CH1 = {9'd10, 9'd2, 9'd6, 9'd14, 9'd9, 9'd1, 9'd5,
9'd13};
注:东侧的GDDR6控制器对通道1使用偶地址,西侧则使用奇地址,因此GDDR6_ID_NOC_CH1中有四个偶数值和四个奇数值。
基于DC接口的测试结构
注:DC接口仅适用于Speedster7t AC7t1400和AC7t1500 FPGA。
下图展示了AXI存储通道模块通过DC接口与GDDR6子系统的交互方式,共有四个GDDR6子系统(GDDR6_1、2、5、6)支持直连可编程逻辑区的接口。可通过《GDDR6子系统控制ID》表指定所需的子系统,本参考设计中,所有DC接口均连接到GDDR6子系统的0通道,有关DC接口连接的更多细节,请参阅《Speedster7t GDDR6用户指南》(UG091)。
图4 • Speedster7t AC7t1400和AC7t1500通过DC接口实现的生成器/校验器逻辑
模拟
本设计支持两种仿真模式:总线功能模型(BFM)模式或独立模式。 不支持全芯片 RTL 仿真,且Riviera工具不支持独立模式仿真。 ·在BFM 模式下,测试平台集成了用于 GDDR6 子系统和存储器的总线功能模型(BFM)。 ·在独立模式下,仅对片上互联结构(fabric)RTL 以及 2D NoC 行为级模块进行仿真,不仿真 DC 接口通道。
设计参数与端口
顶层参数
GDDR6参考设计的顶层RTL模块包含以下参数:
表29 • Speedster7t AC7t1400和AC7t1500 GDDR6参考设计顶层RTL参数
| GDDR6_NOC_CONFIG | 8’b11111111 | Signifies which of the 8 GDDR6 subsystems are enabled for 2D NoC interface testing (1 = enabled, 0 = disabled): bit[0] – GDDR6_0 bit[1] – GDDR6_1 … bit[7] – GDDR6_7 |
| GDDR6_DCI_CONFIG | 4’b1111 | Signifies which of the 4 GDDR6 subsystems are enabled for DC interface testing (1 = enabled, 0 = disabled): bit[0] – GDDR6_1 bit[1] – GDDR6_2 bit[2] – GDDR6_5 bit[3] – GDDR6_6 |
存储通道参数
NAP和DC接口通道分别支持最大16拍和64拍的突发传输,因此实例化存储通道时,必须相应地声明MAX_BURST_LEN参数。
顶层端口
GDDR6参考设计的顶层RTL模块包含以下输入输出端口:
表30 • Speedster7t AC7t1400和AC7t1500 GDDR6参考设计顶层RTL端口
| i_nap_clk | 1 | Clock driving the logic interfacing with the NAP running at 500 MHz. |
| i_reg_clk | 1 | Clock driving the logic interfacing with the register control block running at 200 MHz. |
| i_adm_clk | 1 | Clock driving the ACX_DEVICE_MANAGER soft IP running at 100 MHz. |
| led_l | 8 | LED output bus to determine status of training and test which are tied to GPIO LED outputs on the VectorPath S7t-VG6 and 815 cards (only applicable to AC7t1500). |
| gddr6_*_dc0_clk | 1 | Clock driving the logic interfacing with the DC interface. |
| gddr6_dc0 | – | DC interface AXI signals. |
| pll_lock | 1 | Lock signal for clock i_nap_clk . |
| pll_reg_adm_lock | 1 | Lock signal for clocks i_reg_clk and i_adm_clk. |
| pll_gddr_NE_nap_lock | 1 | Lock signal for PLLs driving eastern GDDR6 NAP channels |
| pll_gddr_NE_dci_lock | 1 | PLL lock signal for DC interface channels on GDDR subsystems 5 and 6. |
| pll_gddr_NW_nap_lock | 1 | Lock signal for PLLs driving western GDDR6 NAP channels |
| pll_gddr_NW_dci_lock | 1 | PLL lock signal for DC interface channels on GDDR subsystems 1 and 2. |
设计考量
本设计中需考虑以下若干要点
时钟
PLL的源acxip文件位于/src/acxip目录,驱动设计所需的PLL时钟详细信息如下表所示:
表31 • Speedster7t AC7t1400和AC7t1500参考设计时钟
| pll fpga_fab_clk_7 | Input | 100 | External reference input clock for the PLL. |
| i_nap_clk | Output | 500 | Clock for NAP memory channels. |
| pll_reg_adm fpga_fab_clk_7 | Input | 100 | External reference input clock for pll_reg_adm . |
| noc_clk | Output | 200 | 2D NOC Reference clock. |
| i_reg_clk | Output | 200 | Clock for register control block logic. |
| i_adm_clk | Output | 100 | Clock for ACX_DEVICE_MANAGER soft IP. |
| pll_gddr_NE_dci fpga_fab_clk_2 | Input | 400 | External reference input clock for pll_gddr_NE_dci. |
| gddr6_5/6_dci_clk | Output | 275 | Reference clock to the corresponding GDDR6 direct-connect interface. This clock is the source of the GDDR6 DC interface gddr6_*_dc0_clk input to the design. |
| pll_gddr_NE_nap fpga_fab_clk_2 | Input | 400 | External reference input clock for pll_gddr_NE_nap. |
| gddr_ctlr_clk_NE | Output | 875/1000 | Reference clock to GDDR6 controller subsystems on the east side of the FPGA. |
| pll_gddr_NW_dci fpga_fab_clk_4 | Input | 10 | External reference input clock for pll_gddr_NW_dci. |
| gddr6_1/2_dci_clk | Output | 275 | Reference clock to the corresponding GDDR6 direct-connect interface. This clock is the source of the GDDR6 DC interface gddr6_*_dc0_clk input to the design. |
| pll_gddr_NW_nap fpga_fab_clk_4 | Input | 10 | External reference input clock for pll_gddr_NW_nap. |
| gddr_ctlr_clk_NW | Output | 875/1000 | Reference clock to GDDR6 controller subsystems on the West side of the FPGA. |
表注:
这些时钟输出直接从参考PLL连接到各自的目标模块,不经过FPGA可编程逻辑区,因此用户逻辑无法使用;
VectorPath S7t-VG6的GDDR6控制器时钟目标频率为875 MHz;
VectorPath 815的GDDR6控制器时钟目标频率为1000 MHz。
时钟域
设计包含两组并行的流量生成器和校验器模块,分别对应NAP接口和DC接口,时钟域如下表所示:
表32 • Speedster7t AC7t1400和AC7t1500时钟域
| i_nap_clk | NAP interface clock source. |
| gddr6_*_dc0_clk | Corresponding DC interface clock domain source. |
| i_reg_clk | Register control block clock domain source. |
| i_adm_clk | Achronix Device Manager clock domain source. |
注:为保持一致性,测试平台和综合约束文件中的频率/周期值需保持一致。
复位
设计利用PLL锁相信号进行复位处理。良好的设计规范要求复位信号需经过仔细的同步和处理,本参考设计使用多个reset_processor_v2模块实例,该模块整合多个复位源,将其正确同步到指定的时钟域,并对复位信号进行流水线处理,以支持扇出控制和重定时。reset_processor_v2模块的输出为每个时钟域提供同步复位信号。
设计包含五个reset_processor实例:
一个实例用于2D NoC电路,将PLL锁相信号作为异步复位,生成与i_reg_clk同步的复位信号reg_rstn,该输出还会同步到NAP时钟域;
每个DC接口对应一个实例,共四个实例,每个实例同样将PLL锁相信号与各自的DC接口输入复位信号dci_input_rstn结合,生成本地信号dci_output_rstn。
2D NoC和DC接口的GDDR6通道分配
参考设计配置为所有2D NoC接口使用通道1,所有DC接口使用通道0,以避免不同AXI存储通道因向同一存储空间写入不同值而产生冲突。但在用户设计中,可能需要这两种接口访问存储器的同一地址空间(例如,2D NoC写入某个存储位置,DC接口从该位置读取,或反之)。
对于DC接口,仅驱动gddr6_*_dc0信号。
BMC接口模块
修订版3及以上且BMC固件版本为1.4.0及以上的VectorPath S7t-VG6卡,以及VectorPath 815卡,要求在用户生成的可编程逻辑区设计中实例化BW_BMC_IF模块。该可编程逻辑区模块允许在VectorPath S7t-VG6/815卡的JTAG连接打开时,通过Bittware SDK持续监控温度。
BW_BMC_IF模块还可选择实例化I2C启动器模块,该模块控制Speedster7t FPGA与VectorPath S7t-VG6/815卡上QSFP/QSFP-DD端口之间的通信。
BW_BMC_IF模块默认在可编程逻辑区的第9列第2行实例化一对NAP_AXI_SLAVE/MASTER,因此VectorPath S7t-VG6/815卡的可编程逻辑区设计不得在该区域放置其他组件。但若设计无需通过USB线为宿主提供BW_BMC_IF模块的访问权限,则这些NAP可放置在可编程逻辑区的任意位置。若实例化I2C启动器模块,BW_BMC_IF模块还需要可编程逻辑区中存在另一个NAP_AXI_MASTER。
该模块位于设计的/src/include目录下,需在顶层RTL文件中添加以下代码:
// Include the BittWare BMC and I2C interface
`include "BW_BMC_IF.svp"
参数
表33 • BW_BMC_IF模块参数
| BMC_NAP_ROW | 2 | Row for BMC NAP placement. |
| BMC_NAP_COLUMN | 9 | Column for BMC NAP placement. |
| INCLUDE_I2C | 0 | Set to include I2C module. |
| I2C_NAP_ROW | f | Row for I2C initiator NAP. |
| I2C_NAP_COLUMN | f | Column for I2C initiator NAP. |
| I2C_CLK_WIDTH | 1000 | Period of I2C interface clock input, i2c_clk_in , in ACLK cycles. |
端口
表34 • BW_BMC_IF端口
| i_clk | 1 | Input | 100 MHz clock. |
| i_rstn | 1 | Input | Negative sense reset. |
| i_timestamp | 32 | Input | Optionally add timestamp to build. |
| i_fw_version | 32 | Input | Optionally add a version register to the build. |
| i_adm_status | 32 | Input | Status from the Achronix Device Manager. |
| i_fpga_avr_rxd | 1 | Input | Input from the BMC. |
| o_fpga_avr_txd | 1 | Output | Output to the BMC. |
| o_fpga_avr_txd_oe | 1 | Output | Output enable for o_fpga_avr_txd. |
| i_fpga_sys_scl_in | 1 | Input | I2C interface clock input. |
| o_fpga_sys_scl_out | 1 | Output | I2C interface clock output. |
| o_fpga_sys_scl_oe | 1 | Output | I2C interface clock output enable. |
| i_fpga_sys_sda_in | 1 | Input | I2C interface data input. |
| o_fpga_sys_sda_out | 1 | Output | I2C interface data output. |
| o_fpga_sys_sda_oe | 1 | Output | I2C interface data output enable. |
| o_fpga_i2c_req_l | 1 | Output | I2C interface request signal from the Speedster7t FPGA. |
| o_fpga_i2c_req_l_oe | 1 | Output | I2C interface request enable. |
| i_fpga_i2c_mux_gnt | 1 | Input | I2C interface grant signal from the BMC. |
表注:
o_fpga_i2c_req_l和i_fpga_i2c_mux_gnt是控制FPGA与BMC之间共享I2C总线的独立信号。FPGA通过置位o_fpga_i2c_req_l请求访问I2C总线,BMC通过置位i_fpga_i2c_mux_gnt授予总线访问权限;FPGA使用完总线后,必须撤销o_fpga_i2c_req_l信号;
当参数INCLUDE_I2C未置1时,这些引脚不实例化。
GDDR6子系统数量
如《GDDR6参考设计顶层RTL参数》表所示,可通过参数配置本设计中使用的GDDR6子系统数量,默认配置启用所有GDDR6子系统。
若设计配置为仅使用部分GDDR6子系统,需编辑默认布局约束文件/src/constraints/ace_placements.pdc,仅保留所用GDDR6子系统的布局配置。
连续和非连续事务
长期稳定性测试,请使用ac7t1500/demo/scripts/gddr6_ref_design_long_term.tcl文件中的脚本,该脚本在存储通道上连续执行24小时事务,每小时输出各存储通道的状态信息,指示是否存在事务失败。此测试仅适用于实际芯片;
非连续测试,请使用ac7t1500/demo/scripts/gddr6_ref_design.tcl文件中的脚本,该脚本在每个存储通道上执行1600万次事务;仿真时同样使用该脚本,但每个存储通道仅执行300次事务。
GDDR6 ACXIP配置
VectorPath 815加速卡
针对VectorPath 815卡上的Speedster7t AC7t1500(量产芯片)FPGA时,GDDR6存储组配置为与美光MT61K512M32-E器件接口。设计利用两个PLL组,将GDDR6控制器时钟配置为1000 MHz,DC接口时钟配置为275 MHz,存储器件配置为在×8翻盖模式下以16 Gbps的数据速率运行。
VectorPath 815 CLKIO和GPIO ACXIP配置
本设计与Achronix VectorPath 815加速卡兼容,/ac7t1500_vp815/demo/bitstream目录下提供的比特流可下载到VectorPath 815卡,通过/ac7t1500_vp815/demo/scripts目录下的脚本执行测试;此外,也可重新构建设计以在该卡上运行。设计在/ac7t1500_vp815/src/acxip目录中包含IP配置(.acxip)文件,这些文件指定了VectorPath 815卡的引脚分配(包括时钟和GPIO信号),CLKIO和GPIO相关的文件如下表所示:
表35 • VectorPath 815 CLKIO和GPIO IP配置文件
| vp815_clkio_ne.acxip | pcie_perst_l, fpga_fab_clk_2, fpga_fab_clk_3 | Input | PCIe PERST; 400 MHz differential; – |
| vp815_clkio_nw.acxip | fpga_fab_clk_4, fpga_fab_clk_5 | Input | 10 MHz differential; 400 MHz differential |
| vp815_clkio_se.acxip | fpga_fab_clk_6, fpga_fab_clk_7 | Input | 50 MHz differential; 100 MHz differential |
| vp815_clkio_sw.acxip | fpga_fab_clk_1 | Input | 200 MHz differential |
| vp815_gpio_n_b0.acxip | exp_gpio_fpga[7:0], ext_gpio_oe_l, led_oe_l, ext_gpio_dir[7:0] | Output | General-purpose I/O; GPIO output enable; Enable LED outputs; GPIO signal direction |
| vp815_gpio_n_b1.acxip | led_l[5:4] | Output | Board LEDs. active low |
| vp815_gpio_n_b2.acxip | led_l[7:6, 3:0] | Output | Board LEDs. active low |
| vp815_gpio_s_b0.acxip | fpga_i2c_mux_gnt, fpga_i2c_req_l, fpga_avr_txd, fpga_avr_rxd, fpga_ftdi_txd, fpga_ftdi_rxd, fpga_rst_l, irq_to_avr, recov_clk_0, qsfp_int_fpga_l, u1pps_in, u1pps_1, u1pps_2, ulpps_1_dir, ulpps_2_dir, ulpps_en_l, freq_dec, freq_inc, clk_gpio0, clk_gpio1 | Input/Output | I2C interface; AVR interface; FTDI interface; Driven from BMC controller; Interrupt; Connect to inputs on clock chip on VP815; QSFP interface. Active low; Provide PPS connectivity to the front panel; Tunes PLL clock frequency on VP815 clock device; Connect to inputs on clock chip on VP815 |
| vp815_gpio_s_b1.acxip | – | – | – |
| vp815_gpio_s_b2.acxip | recov_clk_1, fpga_sys_scl, fpga_sys_sda | Output/Inout | -; PC interface |
表注:t 若将用户设计移植到VectorPath 815卡,建议使用这些文件定义与卡的接口。
仿真配置
仿真模式
本设计支持使用VCS、Questa或Riviera仿真工具进行全芯片总线功能模型(BFM)仿真模式,支持使用VCS或Questa仿真工具进行独立模式仿真。具体支持的模式可查看仿真Makefile,Makefile默认使用全芯片BFM模式;若要以独立模式运行仿真,可在仿真Make命令后添加FLOW=STANDALONE,或编辑Makefile中的flow变量,使后续所有仿真运行均使用RTL模式:
# 命令行方式
> > make (other options) FLOW=STANDALONE
# 编辑Makefile方式
FLOW := STANDALONE
GDDR6 BFM(仅BFM模式)
该模块是整个GDDR6子系统的总线功能模型(BFM),模拟GDDR6控制器、PHY和存储配置,BFM延迟模型同样考虑了这些对应模块的延迟。2D NoC的8个实例化GDDR6 BFM均使用唯一的NAP目标地址,指示每个数据包需要路由到的NAP/2D NoC结构;顶层设计文件中指定的目标地址还包含一个指定位,用于指示GDDR6子系统中哪个通道用于事务传输。本设计中,GDDR6 BFM配置为以16 Gbps的数据速率运行。
图5 • 单个GDDR6子系统2D NoC/DC接口测试结构框图
GDDR6数据速率
仿真中的GDDR6数据速率可通过启用以下文件中的对应行定义:
- BFM模式:/sim/<simulator>/system_files_bfm.f
注:本版本不支持全芯片RTL模式。
设计安装
下载
设计可通过Achronix支持网站下载(需Achronix支持账户),以下两篇知识库文章包含演示、参考和教程设计的下载链接:
1.《如何下载演示和参考设计?》:包含参考设计和移植到VectorPath卡的设计;
2.《如何下载教程?》:包含专注于工具流程(使用ACE和Synplify Pro)的设计。
注:访问上述文章需登录,若要获取访问权限,请参阅《如何注册Achronix支持账户?》。
打包格式
设计以ZIP压缩包形式提供,命名格式如下:
<design_name>_<design_version>_<date_of_packaging>.zip
压缩包包含以下内容:
所有源代码;
设计构建脚本;
仿真脚本文件;
可选的图形界面(GUI)项目文件。
此外,压缩包根目录包含发布说明,记录设计的变更历史。
操作系统
Linux
设计构建脚本和流程原生支持Linux,已在Ubuntu 22.04LTS系统上构建和测试;批处理构建流程使用Makefile,已在Bash环境下测试。
Windows
Windows 10系统下的脚本化仿真或实现流程需安装以下任一工具:
Windows下的Linux环境(如www.cygwin.com),安装时需包含Tcl解释器和make可执行文件。由于Cygwin与原生Linux存在诸多差异,使用时请参阅Achronix支持网站的知识库文章[如何配置Cygwin环境以运行Achronix工具套件?](https://support.achronix.com/hc/en-us/articles/13899761403540-How-Do-I-Set-Up-My-Cygwin-Environment-to-Run-the-Achronix-Tool-Suite);
Windows版Tcl解释器和make可执行文件(若Cygwin未包含),有多种免费和付费版本可供选择。
若无法安装上述任一选项,仍可在Windows下运行部分流程:
实现流程:提供Synplify和ACE的GUI项目文件,可直接通过工具的GUI模式构建;
仿真流程:提供可在QuestaSim Tcl控制台中执行的Tcl脚本,支持在Windows下使用QuestaSim进行仿真,更多细节请参阅《仿真》章节。
注:为确保脚本流程正常运行,ACE需安装在路径名称无空格的目录中,示例路径如下:
-
Windows:C:\\Achronix\\ACE\\x.y.z\\Achronix_CAD_Environment
-
Linux(单用户):/home/<user_id>/ACE/Achronix-linux
-
Linux(共享):/opt/ACE/Achronix-linux
此外,Windows系统下安装时,环境变量ACE_INSTALL_DIR需使用“/”作为路径分隔符,而非“\\”,示例如下:
ACE_INSTALL_DIR = C:/Achronix/ACE/10.3.1/Achronix_CAD_Environment/Achronix
工具版本
所有设计均兼容以下工具版本:
表36 • 最低工具版本要求
| ACE | 10.3.1 |
| Device Simulation Model | 10.2 |
| Synplify Pro | V-2023.09X |
| Mentor Questa | 10.7c-1 |
| Synopsys VCS | P-2019.06 |
| Aldec Riviera Pro | 2021.10-x64 |
表注:t 表中为最低要求版本,预计更新的版本同样兼容本设计。
环境变量
ACE_INSTALL_DIR
为支持可移植项目,设计使用环境变量ACE_INSTALL_DIR,该变量需指向ACE安装目录(即ace可执行文件所在目录),综合和仿真流程均通过该变量定位ACE库文件,更多细节请参阅"操作系统"章节。
SYNPLIFY_HOME
从10.0版本开始,ACE支持集成综合功能,可在ACE设计环境中使用Synplify Pro。为支持该功能,需定义Synplify Pro的安装路径,通过环境变量SYNPLIFY_HOME指定,该变量指向Synplify Pro的安装目录(目录下需包含/bin目录及Synplify Pro可执行文件)。
启动ACE前,必须在环境中设置SYNPLIFY_HOME变量:
# Example of checking and then setting SYNPLIFY_HOME within Linux Bash shell.
# Please check your particular shell for how to set environment variables
bash-4.2$ echo $SYNPLIFY_HOME #
Check if variable is set.
# A
blank response indicates that the variable is not set
bash-4.2$ which synplify_pro
/opt/synopsys/SynplifyPro/V-2023.09X/bin/synplify_pro #
Find path to Synplify Pro installation
bash-4.2$ export SYNPLIFY_HOME=/opt/synopsys/SynplifyPro/V-2023.09X # Set
the variable to the installation directory
bash-4.2$ echo $SYNPLIFY_HOME #
Check variable is set correctly
/opt/synopsys/SynplifyPro/V-2023.09X
目录结构
设计的目录结构便于导航和分离源文件与生成文件,每个支持的器件对应一个顶层目录,目录结构可根据偏好修改,但修改后需相应调整Makefile和构建脚本。为支持可移植性,建议使用相对路径而非绝对路径,并通过环境变量指定根目录。
若需在设计中更改所选器件,请参阅以下知识库文章:如何将Achronix Speedster用户设计移植到新器件?
注:并非所有目录在所有设计中均存在,部分设计可能不需要特定文件。
图6 • 设计目录结构
注:后缀为“s7tvg6”等的子目录,表示该子目录下的设计文件针对特定板卡;若子目录无后缀,则其下的源文件可能不针对任何特定板卡。
语言支持
参考设计支持Verilog、SystemVerilog和VHDL RTL语言,可用于构建和独立仿真。若使用全芯片BFM仿真,顶层测试平台需使用Verilog或SystemVerilog,但被测设计(DUT)可使用VHDL编写。
约束文件
设计在/src/constraints目录下提供完整的约束文件集,展示了如何将各种约束和指令应用于设计,约束文件及其用途如下表所示:
表37 • 约束文件详情
| ace_constraints.sdc | Timing constraints used by ACE. More than one SDC file can be included in an ACE project. |
| ace_options.tcl | Controls ACE settings such as implementation options, flow mode, speed grade and reporting of unconstrained paths. Also used to define Synplify Pro options for ACE-driven integrated synthesis flow. |
| ace_placements.pdc [^t] | Fixes locations of elements within the ACE fabric and creation of placement regions. |
| synplify_constraints.fdc | Synplify FPGA design constraints. Sets attributes such as compile points, or default memory styles. |
| synplify_constraints.sdc | Synplify timing constraints. Clock and timing constraints. Should match those set in ace_constraints.sdc . |
| synplify_options.tcl | Controls Synplify options for standalone synthesis flow, such as top module. Creates synthesis specific parameters, generics, and defines. |
表注:可编程逻辑区与I/O环之间的引脚布局由I/O环设计器自动创建,并在<design_name>_ioring.pdc文件中提供。
I/O环约束文件
除上述约束文件外,ACE I/O设计器工具套件还生成针对可编程逻辑区核心与包含接口子系统的I/O环之间接口的专用约束文件。这些约束文件可通过ACE从相应的.acxip文件重新生成,但为简化构建流程,为需要配置I/O环接口子系统的项目提供了预生成文件,这些文件位于/src/ioring目录下,部分常用文件说明如下:
表38 • I/O环约束文件详情
| <design_name>_ioring.sdc | I/O timing constraints for direct connection interfaces between the fabric and the I/O ring. |
| <design_name>_ioring.pdc | Placement of the fabric I/O pins to assign them to the direct connection interfaces in the I/O ring. |
| <design_name>*ioring\\delays<speed\\grade><temperature>*<fast/slow>.sdc | Timing constraints from the I/O ring peripheral signals to the core fabric |
| <design_name>_ioring_util.xml | Used by ACE to generate a combined utilization report including the fabric and I/O ring resources. |
| <design_name>_ioring_power.xml | Used by ACE to generate an estimated power report for the design. |
设计构建
设计使用统一的构建环境,通过Makefile和脚本以批处理模式运行Synplify Pro和ACE。
前置条件
构建设计前,需确保以下配置完成:
环境变量ACE_INSTALL_DIR已设置,指向包含ACE可执行文件的ACE安装目录;
ACE已添加到环境路径,将$ACE_INSTALL_DIR添加到路径变量;
Synplify Pro已添加到环境路径;
若使用ACE集成综合(ACE 10.0及以上版本),环境变量
S
Y
N
P
L
I
F
Y
H
O
M
E
需指向
S
y
n
p
l
i
f
y
P
r
o
安装目录(包含
/
b
i
n
目录的层级),或环境变量
SYNPLIFY_HOME需指向Synplify Pro安装目录(包含/bin目录的层级),或环境变量
SYNPLIFYHOME需指向SynplifyPro安装目录(包含/bin目录的层级),或环境变量 ACX_SYNPLIFY_TOOL_PATH需指向synplify_pro可执行文件。
I/O环文件
对于Speedster7t系列器件,硬核子系统(GDDR、以太网等)均有各自的配置文件,指定每个子系统的配置,这些文件位于/src/acxip目录下,通过以下方式包含在ACE项目中:
-
直接包含在/src/ace GUI项目文件中;
-
批处理流程中,包含在/src/filelist.tcl文件的multi_acxip_files部分。
ACE编译和布局布线设计时,需使用这些源acxip配置文件生成I/O环约束文件,这些文件指定了硬核子系统(围绕可编程逻辑区形成I/O环)与可编程逻辑区逻辑之间的时序和布局约束,还包含硬核子系统的比特流编程信息。
所有Speedster7t参考设计的/src/ioring目录中均包含预生成的I/O环文件,这些文件使用设计发布说明中指定的ACE版本预生成。
若使用更新版本的ACE,可能需要重新生成这些I/O环文件,更新步骤如下:
注:更新/src/ioring文件前,需确保文件可写;此外,/src/acxip文件也需设为可写,因为新版本ACE可能会更新这些文件。默认情况下,这些文件为只读状态。
I/O环批处理流程
使用make默认流程(无参数)或make ioring_only流程重新生成I/O环文件,ioring_only选项仅生成I/O环文件,不执行综合或ACE布局布线;
I/O环文件的写入目录通过/src/filelist.tcl文件中的generate_ioring_path变量设置,路径相对于/src/ace项目目录,默认值为…/ioring,即指定/src/ioring目录。
I/O环GUI流程
在ACE GUI中,选择“IP配置”视角;
确保“IP问题”窗口中无错误或警告,若有需先解决;
图7 • IP问题窗口
通过以下任一GUI方式触发I/O环设计文件生成:
-
打开“项目→IP”选项下的任意项目硬核子系统配置文件,在打开的IP配置文件中选择“生成”;
-
点击工具栏中的“生成I/O环设计文件”按钮;
图8 • 生成I/O环设计文件的工具栏按钮
ACE会提示选择保存I/O环文件的目录,选择/src/ioring,不要使用ACE默认目录/src/ace/ioring_design; 
图9 • ACE选择IP生成文件目录
I/O环文件重新生成后,可检查/src/ioring目录,确保新文件已生成,且文件版本与用于生成它们的ACE版本匹配。
更改速度等级
ACE根据ACE项目中选择的速度等级(“项目视角→选项→速度等级”),生成命名对应的I/O环.sdc延迟文件。若更改速度等级,ACE会生成新的对应命名文件,这些新文件会在批处理和GUI模式下添加到ACE项目中(需确保从项目中移除之前速度等级的文件)。
警告:批处理流程中更改速度等级时,若使用默认流程选择生成I/O环,ACE项目会包含该次运行的新速度等级约束文件;但后续运行时,ACE项目会根据/src/filelist.tcl文件中指定的文件动态构建,因此选择新速度等级后,需更新filelist.tcl文件,包含与所选速度等级对应的新文件。
批处理流程
根目录下的/build目录包含Makefile,运行Makefile前需确保满足上述前置条件。Makefile中的相对路径设计为从/build目录运行,若将Makefile移动到新位置或在该目录外调用,需相应修改路径。
批处理流程支持两种模式:ACE驱动的集成综合,或Synplify Pro独立综合。
注:默认流程使用ACE驱动的集成综合,需ACE 10.0或更高版本。
ACE驱动的集成综合(默认)
该流程下会创建以下目录:
-
/build/results/ace/impl_1/syn:包含生成的Synplify Pro项目和生成的网表;
-
/build/results/ace/impl_1/pnr:包含布局布线后的设计,该目录下的/output目录包含比特流及下载和运行时所需的其他文件。可在/src/constraints/ace_options.tcl中设置自定义的Synplify Pro选项和ACE选项。
注:运行ACE驱动的集成综合流程需ACE 10.0或更高版本。
Synplify Pro独立综合
独立综合的Makefile目标为“make run_ss”,适用于ACE 10.0之前的版本,或ACE 10.0及以上版本中需使用独立综合流程的场景,该流程下会创建以下目录:
/build/results/syn目录:Synplify Pro以批处理模式执行,综合设计并在/build/results/syn/rev_1/<design_name>.vm中生成网表;若综合失败,可查看/build/results/syn/rev_1/<design_name>.srr获取综合失败详情; 可在/src/constraints/synplify_options.tcl中设置自定义的Synplify Pro选项;
/build/results/ace(10.0之前版本)或/build/results/ace/pnr(10.0及以上版本)包含布局布线后的设计。 该目录下的/output目录包含比特流及下载和运行时所需的其他文件; 可在/src/constraints/ace_options.tcl中设置ACE选项。
更改默认流程
若使用ACE 10.0或更高版本,且希望将独立综合流程设为默认,需修改Makefile中的REV_DIR变量,将其设置为“ace”以外的值,强制使用独立综合流程:
# ACE 10.0及以上版本,默认REV_DIR="ace"时使用ACE集成综合
# 将REV_DIR设置为其他值(如rev_1),默认使用独立综合流程
# 如需覆盖REV_DIR的默认设置,可使用run_ss目标
REV_DIR := ace
或通过调用run_ss目标运行Make流程:
$> make run_ss
Makefile选项
Makefile支持多种构建流程选项:
| $ make | Default flow. Regenerate all files in /src/ioring. Synthesize and build |
| a single implementation with ACE.[^t] | |
| $ make run | Same as "make, except does not regenerate the ioring files.[^t] |
| $ make syn_only | Synthesis only, using standalone Synplify Pro. |
| $ make pnr_only | Run ACE place and route only. This requires synthesis to have |
| previously been run. | |
| $ make run_mp | Run multiprocess. Synthesize and build multiple implementations |
| with ACE multiprocess. | |
| $ make run_ss | Same as “make run” except uses standalone Synplify Pro. |
| $ make ioring_only | Regenerate all files in /src/ioring. |
| $ make clean | Regenerate all files in /src/ioring. |
注:默认情况下,使用ACE驱动的集成综合(需ACE 10.0或更高版本)。
约束文件
除所有I/O环约束文件外,任何构建流程均会使用额外的约束文件,完整的约束文件说明请参阅《设计安装→约束文件》章节。
注:目前,Achronix建议为Synplify Pro和ACE分别使用独立的时序约束(.sdc)文件,不建议使用Synplify Pro生成的.scf文件约束ACE中的时序。
流程中使用的文件完整列表及对应的工具,可通过查看相关的/src/filelist.tcl文件确定。
注:部分设计使用多个前缀或后缀不同的filelist.tcl文件。
GUI流程
设计提供预生成的ACE GUI项目文件,位于/src/ace目录下,打开该文件即可交互式编辑或运行构建。
注:使用GUI项目时,所有生成的文件均放置在GUI项目文件所在目录;若生成全新的Synplify Pro项目,需将该项目生成的网表相应导入ACE项目。
ACE中,实现目录生成为/src/ace/impl_<name>,使用集成综合时,实现目录下包含/pnr(布局布线结果)和/syn(集成综合结果)目录;
ACE中,使用I/O设计器生成新的IP配置文件时,参考设计的目标目录为/src/ioring,ACE默认目录为/src/ace/ioring_design,保存这些文件时需明确指定/src/ioring路径。
批处理流程运行构建时,相关项目文件均写入/build/results目录下,该目录下包含生成的ACE和Synplify Pro项目文件,均可在GUI模式下打开,进行交互式重新运行或编辑构建。
时序收敛
所有Achronix客户设计均已在其发布时对应的工具版本下实现时序收敛,具体工具版本信息可查看项目根目录下的README.txt或Release_Notes.txt文件。Linux系统下,批处理和GUI流程均能实现时序收敛。
注意:Windows系统下编译时,不保证设计的时序收敛。
对于兼容ACE 10.0或更高版本的设计,使用ACE集成综合时可实现时序收敛;独立综合可能具有不同的综合选项,因此使用独立综合构建时,不保证时序收敛。
若使用的工具版本高于设计发布时的版本,通常仍可实现时序收敛;若未实现,建议运行ACE多进程,寻找新的实现选项以实现时序收敛,运行前建议先将所有实现选项重置为默认值:
GUI模式下,使用新版本ACE打开项目时,选择“重置所有选项”;
批处理模式下,移除ace_options.tcl文件中“从多进程提取”部分列出的所有选项。
器件设置
所有参考设计均按<DESIGN>/<DEVICE>的方式为每个器件预配置,但可能需要在综合和布局布线中更改所选器件,以匹配实际实现的器件。
Verilog宏定义
为便于在不同器件之间切换,ACE库包含器件专用的仿真和综合文件,综合文件名为<ACE_INSTALL_DIR>/libraries/device_models/<DEVICE>_synplify.v,这些文件包含器件专用的宏定义,用于包含或排除代码的必要部分。
这些宏定义命名格式为ACX_DEVICE_<完整器件名称>,以下代码示例展示了如何在设计中使用这些宏定义,选择性地包含器件专用模块:
// ———————————————————————-
// Support for the AC7t1400 device
// ———————————————————————-
// If this design is intended to be targeted to the AC7t1400 device,
// then it is necessary to instantiate the SRM, (Serial Rate Monitor).
// This is required in all AC7t1400 designs, as shown below
// ———————————————————————-
// The define ACX_DEVICE_AC7t1400 is set as follows :
// In simulation by $ACE_INSTALL_DIR/libraries/device_models/
AC7t1400_simmodels.v
// In synthesis by $ACE_INSTALL_DIR/libraries/device_models/
AC7t1400_synplify.v
//
// For this design the above files are selected as follows
// In simulation, in the appropriate /sim/<simulator>/Makefile
// In batch build flow, the selection is done in /scripts/
create_syn_project.tcl based on the selected device
// ———————————————————————-
`ifdef ACX_DEVICE_AC7t1400
(* must_keep *) ACX_SRM x_ACX_SRM () /* synthesis syn_noprune=1 */;
`endif
GUI流程
首次更改器件时,需通过GUI流程将IP定义文件(/acxip)目标设置为新器件,然后创建针对新器件正确配置的新IP生成文件(/src/ioring)。
综合
若使用独立综合,第一步需通过Synplify Pro GUI项目生成针对新器件的网表,在.prj文件中进行以下更改:
#project files
add_file -verilog "$ACE_INSTALL_DIR/libraries/device_models/AC7t1400_synplify.v" # <-
Update library file to new device
#device options
set_option -part AC7t1400 # <- Update selected part
注:建议使用文本编辑器编辑Synplify Pro项目文件,而非通过工具编辑。工具不识别用于创建ACE库文件相对路径的环境变量ACE_INSTALL_DIR,若在工具中编辑项目,相对路径会被替换为绝对路径,降低项目的可移植性。
完成上述更改后,可执行综合并生成网表。
ACE
ACE GUI项目需按以下步骤更新:
图10 • ACE选择目标器件
图11 • ACE选择IP
图12 • 选择IP器件批处理流程
建议在使用新器件运行批处理构建流程前,先通过GUI流程更新ACE生成的IP文件(如上述步骤所示)。IP文件更新后,按以下步骤更改器件:
# ——————————
# If targeting Speedster7t AC7t1500 device, enable the lines below
# If using a Speedcore, disable this section
# ——————————
# Currently supported devices, AC7t1500, AC7t1400, AC7t800
DEVICE := "AC7t1500"
$> make DEVICE=AC7t1500
设计运行
本参考设计可针对实际芯片运行,包含预编译的比特流和运行时脚本。若重新构建设计,可使用相同的方法和脚本验证新设计在支持的板卡上的运行情况。
参考文档
有关比特流编程、Tcl脚本流程运行及可用Tcl命令的完整细节,请参阅《Speedster FPGA运行时编程》(AN025)。
前置条件
搭载支持器件的板卡需通电,并通过USB连接到宿主计算机;建议宿主计算机使用与构建设计时相同版本的ACE,具体ACE版本可查看设计中的发布说明或README文件。
注:ACE 9.2及以上版本支持本节详细说明的比特流处理流程。
警告:若ACE安装在Linux系统上,通常需授予ACE访问USB端口的权限,具体操作因Linux发行版而异。有关ACE安装的完整细节,请参阅《ACE安装和许可指南》(UG002)。
注:从ACE 10.3版本开始,Achronix不再以PDF用户指南的形式发布ACE GUI帮助文档,相关内容可通过ACE内置的帮助系统访问。
文件和目录
运行时比特流和脚本分布在以下目录中:
图13 • 运行时文件目录结构
运行时流程
对十六进制比特流进行编程,并执行运行时脚本,在FPGA上演示设计功能。
比特流编程
下载参考设计后,按以下步骤操作:
打开ACE;
在Tcl控制台窗口中,导航到<design_name>/<device>_<board>/demo/scripts目录;
获取连接板卡的JTAG ID,格式为ACVPxxxxxx;
将该值赋值给Tcl变量jtag_id;
以下示例展示了上述步骤的执行序列:
图14 • 设置jtag_id变量 5. 对比特流进行编程,确保使用正确的器件版本对应的program_hex_file函数。建议使用相对于当前目录的相对路径,program_hex_file函数会在JTAG端口未打开时自动打开端口;
图15 • 比特流编程 部分设计的demo/scripts目录中可能包含执行上述所有步骤的脚本,更多信息可查看每个设计中的发布说明/readme文件。
设计运行
图16 • 执行运行时脚本 注:JTAG端口已打开的警告为正常现象,JTAG端口在之前的编程步骤中已打开;运行时脚本包含打开JTAG端口的命令,以防器件编程后端口被关闭。为便于构建的版本控制,Achronix提供的工具流程生成的比特流名称中包含主版本号和次版本号(如my_design_top.1.12.hex),这些版本号定义在/src/include/version_defines.svh文件中,同时填充到寄存器控制块的版本寄存器中,因此可将比特流名称与内部版本号关联,确定当前运行的构建版本。板卡状态监控
若适用,观察板卡上的四个多色LED,确保其显示与设计文档中描述的行为一致。每个LED显示的颜色由8位led_l总线中对应LED的两位设置决定,具体如下表所示:
表39 • VectorPath S7t-VG6卡多色LED
| D3 | led_l[0] | AP17 | Orange | Active Low | GPIO_N0_BYTE2_BIT_0 | Bottom (nearest the board). |
| D3 | led_l[4] | AN16 | Green | Active Low | GPIO_N0_BYTE1_BIT_0 | Bottom (nearest the board). |
| D4 | led_l[1] | AR17 | Orange | Active Low | GPIO_N0_BYTE2_BIT_1 | Second position. |
| D4 | led_l[5] | AR16 | Green | Active Low | GPIO_N0_BYTE1_BIT_1 | Second position. |
| D5 | led_l[2] | AT17 | Orange | Active Low | GPIO_N0_BYTE2_BIT_2 | Third position. |
| D5 | led_l[6] | AR19 | Green | Active Low | GPIO_N0_BYTE2_BIT_6 | Third position. |
| D6 | led_l[3] | AV18 | Orange | Active Low | GPIO_N0_BYTE2_BIT_3 | Top position. |
| D6 | led_l[7] | AT20 | Green | Active Low | GPIO_N0_BYTE2_BIT_7 | Top position. |
表注:当某个LED对应的两位led_l信号均置低时,LED显示为黄色。
表40 • VectorPath 815卡多色LED
| LED1 | led_l[0] | AP17 | Green | Active Low | GPIO_N0_BYTE2_BIT_0 | Bottom (nearest the board). |
| LED1 | led_l[4] | AN16 | Orange | Active Low | GPIO_N0_BYTE1_BIT_0 | Bottom (nearest the board). |
| LED2 | led_l[1] | AR17 | Green | Active Low | GPIO_N0_BYTE2_BIT_1 | Second position. |
| LED2 | led_l[5] | AR16 | Orange | Active Low | GPIO_N0_BYTE1_BIT_1 | Second position. |
| LED3 | led_l[2] | AT17 | Green | Active Low | GPIO_N0_BYTE2_BIT_2 | Third position. |
| LED3 | led_l[6] | AR19 | Orange | Active Low | GPIO_N0_BYTE2_BIT_6 | Third position. |
| LED4 | led_l[3] | AV18 | Green | Active Low | GPIO_N0_BYTE2_BIT_3 | Top position. |
| LED4 | led_l[7] | AT20 | Orange | Active Low | GPIO_N0_BYTE2_BIT_7 | Top position. |
表注:t 当某个LED对应的两位led_l信号均置低时,LED显示为黄色。
设计仿真
支持的仿真器
参考设计提供仿真环境,包含Mentor QuestaSim、Synopsys VCS和Aldec Riviera仿真器的脚本。
位置
所有设计的根目录下均有/sim目录,该目录下包含/vcs、/questa和/riviera子目录,分别对应各仿真器。
仿真流程
适用于参考设计的仿真流程提供多种选项,可在速度和精度之间取得平衡,并非所有参考设计都支持所有流程选项,具体支持的选项可查看相应的Makefile。
独立模式(Standalone)
设计中的任何NAP均使用绑定到该NAP的独立模型,模拟存储行为。该模式是运行速度最快的仿真模式,但周期精度最低;NAP仅与其自身的存储模型交互,因此不支持多个NAP访问公共存储的场景。若要在提供的参考设计中启用该模式,需将仿真Makefile中的FLOW变量设置为STANDALONE。
全芯片BFM模式(Full-Chip BFM)
使用全芯片模型,包含周期精确的NoC,NoC周围的所有硬核接口均配有总线功能模型(BFM),这些BFM具有代表性的延迟,因此该模式可提供接近周期精确的仿真。该模式无需接口子系统执行初始化和校准步骤,相比全周期精确仿真,迭代时间更短。
全芯片RTL模式(Full-Chip RTL)
该模式使用子系统的完整寄存器传输级(RTL)代码,必要时结合外部组件(如存储)的周期精确模型,可提供完全周期精确的仿真,反映最终芯片的运行情况。大多数此类仿真需要使用提供的配置文件配置相关子系统,由于使用子系统的完整RTL代码,仿真速度比对应的BFM仿真慢,但时序精度完全准确。
注:若要获取GDDR/DDR或PCIe子系统的加密RTL代码,需额外的授权仿真包,请联系Achronix技术支持获取授权和访问权限。
若要在提供的参考设计中启用该模式,需将仿真Makefile中的FLOW变量设置为FULLCHIP_RTL。
构建选项
每个仿真器目录下均有一个Makefile,可编辑该文件配置仿真以适配用户设计,需设置以下变量:
-
FLOW:匹配所选的仿真流程,选项(Makefile中有详细说明)包括STANDALONE、FULLCHIP_BFM或FULLCHIP_RTL;
-
TOP_LEVEL_MODULE:为提供的设计预设,但若设计移植到用户测试平台,需更新该变量;
-
ACX_DEVICE_INSTALL_DIR:指向目标器件文件所在的目录(通常在ACE目录下),例如$ACE_INSTALL_DIR/system/data/AC7t1500,更多信息请参阅I/O环仿真安装说明。
前置条件
运行任何安装前,需确保以下配置完成:
-
环境变量ACE_INSTALL_DIR已设置,指向包含ACE可执行文件的ACE安装目录;
-
所需仿真器的路径已配置,对于VCS,还需设置VCS_HOME环境变量。
自动文件列表生成
仿真文件列表从../../src/filelist.tcl文件自动生成,创建仿真文件列表的脚本为../../scripts/create_sim_project.tcl,该脚本使用../scripts/sim_template.f或../../scripts/sim_template_bfm.f模板文件定义通用仿真选项。具体仿真器的Makefile会调用创建脚本(如下例所示),生成的sim_filelist.f文件结合了模板内容和../../src/filelist.tcl中的特定文件列表。
文件
每个/sim/vendor目录下包含以下脚本:
-
Makefile:支持多种仿真流程的Makefile,默认目标为编译并运行仿真;
-
system_files_bfm.f(仅全芯片BFM流程):全芯片BFM流程使用的系统文件列表,也可在该文件中添加用户定义;
-
system_files_rtl.f(仅全芯片RTL流程):全芯片RTL流程使用的系统文件列表,还包含指定哪些子系统使用周期精确RTL而非BFM的定义,定义命名格式为<子系统名称>_FULL(如GDDR6_2_FULL),也可在该文件中添加用户定义。
VCS专用文件
-
fullchip_bfm_vcs_waiver.cfg(仅全芯片BFM流程):用于消除无害警告的豁免文件;
-
session.sim_output_pluson.vpd.tcl:DVE波形查看器的会话文件。
QuestaSim和Riviera专用文件
-
wave.do:波形文件;
-
qsim_<design_name>.do:非Makefile GUI流程,跨操作系统兼容。
RTL仿真定义
编译和运行全芯片RTL流程时,需启用仿真编译的SystemVerilog定义。将仿真Makefile中的FLOW变量设置为FULLCHIP_RTL,会指示Makefile在编译命令行中包含system_files_rtl.f文件。
system_files_rtl.f文件中启用了所有必要的定义,用于将仿真模块从BFM模型切换到完整RTL。例如,若使用GDDR6参考设计,希望仿真GDDR6存储控制器1的完整RTL,而其他所有GDDR6控制器使用BFM模型,需按以下方式编辑system_files_rtl.f文件:
# Define GDDR Data Rate
+define+GDDR6_DATA_RATE_16 # <—– For GDDR6 RTL simulation the user must
enable one of the data rates.
//+define+GDDR6_DATA_RATE_14
//+define+GDDR6_DATA_RATE_12
# Turn on GDDR RTL
# Enable the desired GDDR memory controllers below
# Any undefined controllers will use their BFM model
//+define+ACX_GDDR6_0_FULL
+define+ACX_GDDR6_1_FULL # <— User enables this define
//+define+ACX_GDDR6_2_FULL
//+define+ACX_GDDR6_3_FULL
//+define+ACX_GDDR6_4_FULL
//+define+ACX_GDDR6_5_FULL
//+define+ACX_GDDR6_6_FULL
//+define+ACX_GDDR6_7_FULL
以下表格列出了启用各模块完整RTL(而非BFM)的可用定义:
表41 • 仿真RTL定义
| GDDR6 controller 0 | ACX_GDDR6_0_FULL |
| GDDR6 controller 1 | ACX_GDDR6_1_FULL |
| GDDR6 controller 2 | ACX_GDDR6_2_FULL |
| GDDR6 controller 3 | ACX_GDDR6_3_FULL |
| GDDR6 controller 4 | ACX_GDDR6_4_FULL |
| GDDR6 controller 5 | ACX_GDDR6_5_FULL |
| GDDR6 controller 6 | ACX_GDDR6_6_FULL |
| GDDR6 controller 7 | ACX_GDDR6_7_FULL |
| DDR4 controller | ACX_DDR4_FULL |
| Ethernet subsystems (both) | ACX_ETHERNET_FULL |
| PCIe Controller 0 (×8) | ACX_PCIE_0_FULL |
| PCIe controller 1 (×16) | ACX_PCIE_1_FULL |
| GPIO North block | ACX_GPIO_N_FULL |
| GPIO South block | ACX_GPIO_S_FULL |
| All SerDes lanes | ACX_SERDES_FULL |
| All PLLs and Clock Generators [^3] | ACX_CLK_NW_FULL, ACX_CLK_NE_FULL, ACX_CLK_SW_FULL, ACX_CLK_SE_FULL |
表注:
警告:为模块启用完整RTL仿真会增加仿真时间,若启用多个模块,仿真时间可能会显著延长。
GDDR6 BFM存储大小
如前所述,GDDR6仿真支持BFM和RTL两种模型。若要在RTL中设置支持的存储大小,需在测试平台中实例化相应的GDDR6模型;此外,使用GDDR6 BFM模型时,可在支持16Gb和8Gb器件大小的模型之间切换。
默认情况下,GDDR6 BFM配置为支持16Gb器件(两个8Gb通道);若要将GDDR6 BFM设置为仅支持每个器件8Gb(两个4Gb通道),需为所有GDDR6控制器模块设置以下定义:ACX_GDDR6_BFM_8Gb
建议在/sim/<simulator>/system_files_bfm.f文件中设置该定义。
注:定义ACX_GDDR6_BFM_8Gb适用于DSM中的所有GDDR6 BFM,无法为不同的GDDR6 BFM设置不同的存储大小,该定义仅适用于仿真。硬件中,可单独配置每个GDDR6控制器,以匹配相应连接的GDDR6器件大小。
运行时编程脚本
许多参考设计在用户设计中使用控制模块(/src/reg_control_block.sv),该模块在参考设计中创建一组用户寄存器,用于运行时(芯片处于用户模式时)控制和监控测试。这些寄存器的编程与器件的配置阶段不同(配置阶段会将静态配置加载到各个接口子系统的控制和状态寄存器(CSR)存储空间)。用户寄存器为设计提供配置灵活性,可用于版本控制、确定设计功能、控制和监控序列及测试。
仿真命令文件
reg_control_block包含ACX_NAP_AXI_MASTER,用于控制生成的用户寄存器,可通过仿真命令文件对这些寄存器进行编程。仿真中,该命令文件由FPGA配置单元(FCU)的BFM模型读取,命令文件中的命令传输到ACX_NAP_AXI_MASTER,进而对参考设计中的用户寄存器执行所需操作。按照惯例,仿真命令文件为扩展名为.txt的文本文件,格式与《器件仿真模型》中展示的“配置文件格式”一致。
运行时编程脚本
仿真命令文件由运行时编程脚本生成,运行时编程脚本使用Tcl编写,可在ACE Tcl控制台中直接在硬件上执行。通过使用同一运行时编程脚本生成仿真命令文件,可确保仿真和硬件中测试的操作序列一致。
运行时编程脚本包含多个关键部分,详细说明如下:
# Include any utility files that may have common functions
source AC7t1500_common_utils.tcl
# Define simulation command filename name and location.
# Path is relative to this script location
set OUTPUT_FILENAME "../../sim/<simulation command filename>.txt"
# Process any input arguments
# IMPORTANT : This must be included for the reg_lib_sim_generate option
ac7t1500::process_args $argc $argv
# Open the simulation command file.
# File will only be created if not running under ACE
# Pass script name, ($argv0), for header
ac7t1500::open_command_file $OUTPUT_FILENAME $argv0
# When running under ACE, ensure jtag port is open
# When generating a simulation command file, this call is ignored.
ac7t1500::open_jtag
# ———————————————————————
# Test code starts here
# ———————————————————————
# ———————————————————————
# Test code ends here
# ———————————————————————
# Close command file
# File will only exist when not running under ACE
ac7t1500::close_command_file $OUTPUT_FILENAME
注:寄存器库Tcl函数使用基于器件的命名空间,以便在多个器件之间使用通用函数名,命令格式为<器件命名空间>::function()。上例适用于Speedster7t AC7t1500 FPGA,使用其他器件时,需将命令的命名空间更改为相应的目标器件。
仿真命令文件生成
运行时编程脚本和仿真命令文件均使用ACE内置的器件寄存器库,有关该寄存器库的完整细节,请参阅《Speedster FPGA运行时编程》(AN025)。若要生成仿真命令文件,需以批处理模式运行ACE,调用运行时编程脚本,命令如下:
# Call to ACE in batch mode to create a simulation command file
ace -batch -script_file <path to runtime programming script> -script_args "-
reg_lib_sim_generate 1 -device $(BASE_NAME)"
对于使用仿真命令文件的参考设计,生成命令包含在/sim/<simulator>/Makefile中,仿真命令文件生成在运行时编程脚本中指定的位置。参考设计中,仿真命令文件写入/sim目录,以便所有仿真器均可使用,示例仿真命令文件可在“配置文件格式”部分查看。
reg_lib_sim_generate
ACE需区分两种场景:一是运行时编程脚本在硬件上执行(可能需要打开JTAG端口或轮询寄存器响应),二是运行时编程脚本用于创建仿真命令文件。为区分这两种模式,器件寄存器库中使用了一个内置变量:reg_lib_sim_generate。
-
ACE在硬件上运行时,reg_lib_sim_generate未设置,Tcl脚本命令直接在ACE Tcl控制台中执行;
-
按上例中的ace命令以批处理模式执行ACE时,reg_lib_sim_generate被设置,ACE会将运行时编程脚本的Tcl命令转换为等效的仿真命令,并写入仿真命令文件。
若需要命令在硬件和仿真之间有所不同(例如,硬件中可运行包含数百万次事务的扩展测试,而仿真中执行此类测试不可行),可在运行时编程脚本中使用reg_lib_sim_generate变量选择不同的硬件和仿真控制流程。可通过Tcl函数::get_reg_lib_sim_generate()读取该变量的状态,示例如下:
# Use function get_reg_lib_sim_generate to determine if this script is being run under
hardware or simulation
if { ![ac7t1500::get_reg_lib_sim_generate] } {
# Hardware test – test 10M packets
set num_pkts 10000000
} else {
# Simulation test – test 1000 packets
set num_pkts 1000
}
测试平台序列
使用仿真命令文件时,需确保其应用顺序与硬件中执行的顺序一致。
运行时编程脚本在器件处于用户模式时执行,此前为配置模式(此时比特流加载到接口子系统和可编程逻辑区)。Speedster7t器件上的FCU_CONFIG_USER_MODE引脚指示该模式,仅当该信号置位时,才应执行仿真命令文件。有关配置引脚和编程模式的完整细节,请参阅《Speedster7t配置用户指南》(UG094)。
以下示例序列展示了与DSM模型的连接、器件配置和运行时编程序列:
// Create signal to indicate device configuration state
// When set, device is in user mode
logic chip_ready;
// Instantiate the DSM model, (device dependant)
`ACX_DEVICE_NAME `ACX_DEVICE_NAME (
.FCU_CONFIG_USER_MODE (chip_ready)
);
// Programming sequence
initial
begin
// Device configuration phase. Use ACE generated configurations
// These configurations perform the same function as loading the bitstream
`include "../../src/ioring/<design name>_sim_config.svh"
// Wait for device to enter user mode
while ( chip_ready !== 1'b1 )
@(posedge clk);
// Device now in user mode
// Execute simulation command file to perform runtime programming
`ACX_DEVICE_NAME.fcu.configure( "../<simulation command file>.txt", "full");
// When simulation command file completes, test is done
$finish
end
运行仿真
所有仿真器流程的仿真目录下均有一个Makefile,支持以下构建选项:
VCS
$ make : Default flow. Compile with no debug options, run in batch mode
writing the output to a VPD file.
$ make run : Same as "make".
$ make debug : Build with debug options (increased visibility of lower level
variables).
Run in batch mode writing to a VPD file.
$ make open_dve : Open the DVE waveform viewer and load the VPD file and viewing
session file.
$ make clean : Delete all generated and temporary files.
QuestaSim和Riviera
$ make : Default flow. Compile with no debug options, run in batch mode
writing the output to a WLF file.
$ make run : Default flow. Same as "make".
$ make debug : Build with debug options (increased visibility of lower level
variables). Open GUI with wave.do and allow user to run interactively.
$ make open_wave : Open the GUI waveform viewer. Load the generated WLF file and
viewing wave.do file.
$ make clean : Delete all generated and temporary files.
QuestaSim和Riviera非Makefile流程
为支持不原生支持Makefile的环境(如Windows),QuestaSim和Riviera提供额外的非Makefile流程,使用.do文件,需按以下步骤操作:
注:以下示例针对QuestaSim,Riviera的操作步骤相同,需在/riviera目录下运行。
导航到sim/questa目录;
启动QuestaSim GUI,通常命令为:
$ vsim
$ do qsim_<design_name>.do
注:QuestaSim和Riviera脚本使用ACE_INSTALL_DIR环境变量,为确保该(或任何其他)脚本流程正常运行,ACE需安装在路径名称无空格的目录中;此外,环境变量ACE_INSTALL_DIR需使用“/”作为路径分隔符,而非“\\”,示例如下:
ACE_INSTALL_DIR = C:/achronix/10.0/Achronix_CAD_Environment/Achronix
.do脚本默认配置为FULLCHIP_BFM流程,可通过选择脚本中注释的相应选项,将其修改为STANDALONE或FULLCHIP_RTL流程。
结果验证
所有设计均使用自校验测试平台,将RTL生成的结果与验证输出进行比对。验证输出可来自多个来源,包括数学包、软件模型或RTL行为模型,各设计的详细信息中提供了适用的验证来源详情。
仿真中更改器件
所有参考设计均为每个器件预配置,但可能需要在仿真中更改所选器件,以匹配实际实现的器件。
Verilog宏定义
为便于在不同器件之间切换,ACE库包含器件专用的仿真和综合文件,仿真文件名为<ACE_INSTALL_DIR>/libraries/device_models/<DEVICE>_simmodels.sv,这些文件包含器件专用的宏定义,用于包含或排除代码的必要部分。
这些宏定义命名格式为ACX_DEVICE_<完整器件名称>,以下代码示例展示了如何在测试平台中使用这些宏定义,选择相应的DSM:
// Include the appropriate DSM utility file which defines the appropriate macros
// If an unsupported device is selected, then compilation will fail
`ifdef ACX_DEVICE_AC7t1500
`include "ac7t1500_utils.svh"
`elsif ACX_DEVICE_AC7t800
`include "ac7t800_utils.svh"
`endif
上例中,所选的DSM工具文件创建另一个宏ACX_DEVICE_NAME,与完整器件名称匹配,该宏在整个测试平台中用于引用DSM,示例如下:
// Instantiate DSM
// ACX_DEVICE_NAME is defined in the DSM utility file for the selected device
`ACX_DEVICE_NAME `ACX_DEVICE_NAME (
.FCU_CONFIG_USER_MODE (chip_ready)
);
所需更改
以下步骤展示如何更改仿真器件:
# Define the target device
# Devices currently supported; AC7t1500, AC7t1400 and AC7t800ES0
DEVICE := AC7t1500
$> make DEVICE=AC7t800
# ———————————————————————
# Define the target device
# ———————————————————————
# Devices currently supported; AC7t1500, AC7t1400 and AC7t800ES0
DEVICE := "AC7t1500"
注:定义和器件名称区分大小写,覆盖或指定器件名称时需使用正确的大小写格式。
器件仿真模型(Device Simulation Model)
许多设计需要名为器件仿真模型(DSM)的仿真覆盖层,该包结合了2D片上网络(NoC)的完整RTL代码和NoC及FPGA可编程逻辑区周围接口子系统的总线功能模型(BFM)。2D NoC的真实RTL与接口子系统的模型相结合,可在快速响应的仿真环境中开发设计,同时实现来自NoC的周期精确接口和来自硬核接口子系统的代表性周期响应,该仿真环境支持设计师快速迭代开发和调试设计。
描述
DSM提供NoC的完整RTL代码,结合周围接口子系统的BFM,其结构封装在以器件命名的SystemVerilog模块中(如ac7t1500),需在顶层测试平台中实例化该模块的一个实例。
此外,DSM提供绑定宏,可实现设计元素与器件中相同元素之间的绑定。例如,设计中可能实例化2D NoC访问点(NAP),此时需使用ACX_BIND_NAP_RESPONDER、ACX_BIND_NAP_INITIATOR、ACX_BIND_NAP_HORIZONTAL、ACX_BIND_NAP_VERTICAL或ACX_BIND_NAP_ETHERNET宏(根据设计需求选择),将该NAP实例绑定到2D NoC中正确位置的NAP。
同样,需在设计的端口与接口子系统的直连接口(DCI)之间建立绑定。器件中的每个DCI均连接到SystemVerilog接口,可从顶层测试平台直接访问该接口,并在SystemVerilog接口和设计的端口之间分配信号。
选择所需的DSM
DSM工具包
每个器件均有对应的DSM包,每个DSM代表该器件的特定功能,因此需在仿真测试平台中选择正确的DSM。通过包含相应的DSM工具包可选择正确的DSM,该包随后创建用于访问相应DSM的宏和函数。工具包定义宏ACX_DEVICE_NAME,随后用于实例化和引用DSM,可用的DSM工具包如下表所示:
表42 • DSM工具包
| AC7t1500, AC7t1500ES0 | ac7t1500_utils.svh | ac7t1500 |
| AC7t1400, AC7t1400ES0 | ac7t1400_utils.svh | ac7t1400 |
| AC7t800, AC7t800ES0 | ac7t800_utils.svh | ac7t800 |
器件专用仿真文件
为支持代码重用,Achronix仿真流程为每个器件创建格式为ACX_DEVICE_<完整器件名称>的宏,当项目中包含相应的ACE库文件时,仿真(和综合)中会存在该宏。这些ACE库文件位于<ACE_INSTALL_DIR>/libraries/device_models/<完整器件名称>_simmodels.sv,以下表格列出了可用的simmodels.sv文件及其创建的器件专用宏:
表43 • 仿真模型文件和定义
| AC7t1500 | AC7t1500[_simmodels.sv](_simmodels.sv) | ACX_DEVICE_AC7t1500 |
| AC7t1500ES0 | AC7t1500ES0[_simmodels.sv](_simmodels.sv) | ACX_DEVICE_AC7t1500ES0 |
| AC7t1400 | AC7t1400[_simmodels.sv](_simmodels.sv) | ACX_DEVICE_AC7t1400 |
| AC7t1400ES0 | AC7t1400ES0[_simmodels.sv](_simmodels.sv) | ACX_DEVICE_AC7t1400ES0 |
| AC7t800 | AC7t800[_simmodels.sv](_simmodels.sv) | ACX_DEVICE_AC7t800 |
| AC7t800ES0 | AC7t800ES0[_simmodels.sv](_simmodels.sv) | ACX_DEVICE_AC7t800ES0 |
实例化DSM工具包
使用器件专用宏,可创建适用于多个器件的通用DSM实例化。以下示例中,使用ACX_DEVICE_xxxx宏选择相应的DSM工具包,该包随后创建的宏用于选择相应的DSM:
// Include the appropriate DSM utility file which defines the appropriate macros
// If an unsupported device is selected, then compilation will fail
`ifdef ACX_DEVICE_AC7t1500ES0
`include "ac7t1500_utils.svh"
`elsif ACX_DEVICE_AC7t1500
`include "ac7t1500_utils.svh"
`elsif ACX_DEVICE_AC7t800ES0
`include "ac7t800_utils.svh"
`endif
// Instantiate the DSM
// ACX_DEVICE_NAME is defined in the DSM utility file for the selected device
// Connect the chip_ready signal
`ACX_DEVICE_NAME `ACX_DEVICE_NAME (
.FCU_CONFIG_USER_MODE (chip_ready),
);
版本控制
DSM受版本控制,一个版本中可能添加新功能,同时弃用或替换旧功能。版本信息既包含在包名称中(ACE_<major>.<minor>.<patch>*DSM_sim*<update>.zip/tgz),也包含在包根目录下的readme文件中。
为确保使用正确版本的DSM,设计测试平台中需包含一个任务,确认版本兼容性,该函数的实例化如下:
// The ACX_DEVICE_NAME macro is defined for each DSM within its appropriate utility
package
initial begin
// Ensure correct version of DSM is being used
// This design requires 10.1 as a minimum
`ACX_DEVICE_NAME.require_version(10, 1, 0, 0);
end
require_version()任务
require_version任务包含四个参数,顺序如下:
主版本号(Major Version):与发布版本的主版本号匹配;
次版本号(Minor Version):与发布版本的次版本号匹配;
补丁版本号(Patch):与发布版本的补丁版本号匹配(可选);
更新号(Update):与发布版本的更新号匹配(可选)。
若未指定补丁版本号或更新号,这些参数应设为0。例如,对于10.1版本,参数设置为10,1,0,0。
注:这些值可表示为数字(0-9)、字符串(“0”–“9”)或字母(“a/A”、“b/B”),其中字母"a"和"b"代表alpha或beta版本。确定发布版本的优先级时,数字代表的版本比字母代表的版本更新,因此8.3.alpha(定义为8,3,“a”,0)早于完整的8.3版本(指定为8,3,0,0)。
示例设计
以下框图展示了用户测试平台的示例结构,同时实例化了DSM和用户被测设计,该示例展示了响应器NAP所需的宏,以及两个GDDR6子系统的DCI。对于其他类型的NAP或其他DCI类型(如DDR),请参阅《绑定宏》和《DSM直连接口》表格。
图17 • 示例仿真结构
上例中包含两个NAP(my_nap1和my_nap2)和两个直连接口(my_dc0_1和my_dc0_2),顶层测试平台中使用ACX_BIND_NAP_RESPONDER宏,在设计中的NAP和器件中的NAP之间建立绑定:
-
该宏支持插入NAP在2D NoC中的坐标,确保仿真与NAP在芯片上的物理布局一致;
-
DCI是用户设计的端口,这些端口分配到器件直连SystemVerilog接口中的相应信号。
以下Verilog代码基于Speedster7t AC7t1500 FPGA,展示了该示例的实例化:
// ———————————————-
// Instantiate the DSM
// ———————————————-
// Connect the chip ready port
// Note : All DSM ports are defined, so can be directly connected if required
`ACX_DEVICE_NAME `ACX_DEVICE_NAME( .FCU_CONFIG_USER_MODE (chip_ready ) );
// Set the verbosity options on the messages
// Use the inbuilt set_verbosity() task.
initial begin
`ACX_DEVICE_NAME.set_verbosity(2);
end
// ———————————————-
// Bind NAPs
// ———————————————-
// Bind my_nap1 to location 4,5
`ACX_BIND_NAP_AXI_RESPONDER(dut.my_nap1,4,5);
// Bind my_nap2 to location 2,2
`ACX_BIND_NAP_AXI_RESPONDER(dut.my_nap2,2,2);
// ———————————————-
// Connect to DC interfaces
// ———————————————-
// Create signals to attach to direct-connect interface
logic my_dc0_1_clk;
logic my_dc0_1_awvalid;
logic my_dc0_1_awaddr;
logic my_dc0_1_awready;
…..
logic my_dc0_2_clk;
logic my_dc0_2_awvalid;
logic my_dc0_2_awaddr;
logic my_dc0_2_awready;
…..
// Connect signals to gddr6_xx_dc0 interface within ac7t1500 device
// Inputs to device
assign `ACX_DEVICE_NAME.gddr6_xx_dc0.awvalid = my_dc0_1_awvalid;
assign `ACX_DEVICE_NAME.gddr6_xx_dc0.awaddr = my_dc0_1_awaddr;
….
// Outputs from device
assign my_dc0_1_awready = `ACX_DEVICE_NAME.gddr6_xx_dc0.awready;
….
// Connect signals to gddr6_xx_dc0 interface within ac7t1500 device
// Inputs to device
assign `ACX_DEVICE_NAME.gddr6_yy_dc0.awvalid = my_dc0_2_awvalid;
assign `ACX_DEVICE_NAME.gddr6_yy_dc0.awaddr = my_dc0_2_awaddr;
….
// Outputs from device
assign my_dc0_2_awready = `ACX_DEVICE_NAME.gddr6_yy_dc0.awready;
….
// ———————————————-
// Remember to connect the clock!
// ———————————————-
assign my_dc0_1_clk = `ACX_DEVICE_NAME.gddr6_xx_dc0.clk;
assign my_dc0_2_clk = `ACX_DEVICE_NAME.gddr6_yy_dc0.clk;
set_verbosity()任务
除指定所需的仿真包版本和实例化器件外,还可控制器件仿真模型输出消息的详细程度,这些级别通过set_verbosity任务控制,上例代码展示了该函数的调用方式。
详细程度级别定义如下表所示:
表44 • 详细程度级别
| 0 | Print no messages. |
| 1 | Print messages from initiator and responder interfaces only. |
| 2 | Print messages from level 1 and from each NoC data transfer. |
| 3 | Print messages from level 2, port bindings and NoC performance statistics. |
芯片状态输出
仿真开始后,器件的运行方式与实际芯片类似,初始化期间器件处于复位状态(硬件中,该阶段发生在加载比特流的配置过程中)。初始化阶段结束后,器件置位FCU_CONFIG_USER_MODE信号,指示已进入用户模式,此时设计开始运行。
建议顶层测试平台监控FCU_CONFIG_USER_MODE信号,待该信号置位后,再向器件施加激励(上例中通过测试平台的chip_ready信号实现)。
绑定宏
可用的绑定语句如下表所示:
表45 • 绑定宏
| ACX_BIND_NAP_HORIZONTAL | user_nap_instance , noc_column , noc_row | To bind a horizontal streaming NAP, instance ACX_NAP_HORIZONTAL . |
| ACX_BIND_NAP_VERTICAL | user_nap_instance , noc_column , noc_row | To bind a vertical streaming NAP, instance ACX_NAP_VERTICAL . |
| ACX_BIND_NAP_AXI_INITIATOR [^2] | user_nap_instance , noc_column , noc_row | To bind an AXI initiator NAP, instance ACX_NAP_AXI_INITIATOR . |
| ACX_BIND_NAP_AXI_RESPONDER [^2] | user_nap_instance , noc_column , noc_row | To bind an AXI responder NAP, instance ACX_NAP_AXI_RESPONDER . |
| ACX_BIND_NAP_ETHERNET | user_nap_instance , noc_column , noc_row | To bind an Ethernet NAP instance, ACX_NAP_ETHERNET . |
表注:
直连接口(Direct-Connect Interfaces)
器件中,高速接口子系统(如GDDR、DDR、以太网和SerDes)与可编程逻辑区之间的非NAP连接称为直连接口(DCI),包括:
-
存储接口(AXI)的额外数据端口;
-
SerDes的专用数据接口(直接模式);
-
以太网的状态和控制接口。
有关每个子系统DCI端口的完整细节,请参阅相应的接口子系统用户指南。
用户设计与DCI端口的连接有两种方法:
-
直接使用DSM中内置的接口;
-
使用ACE生成的端口绑定文件。
注:Speedster7t AC7t800 FPGA仅为SerDes直接模式提供DCI,接口子系统与可编程逻辑区之间的所有其他数据流均通过NAP和2D NoC实现。
建议流程
通常,项目开始时使用直接连接DSM端口的方法(此时ACE项目可能尚未开发),后续可决定使用ACE绑定文件。两种方法的目标相同——将被测设计(DUT)的I/O端口连接到DSM中的相应位置。
-
直接连接方法:使用SystemVerilog接口,因此可在这些接口中添加协议检查和性能测量等额外功能;
-
ACE端口绑定方法:有助于确认被测设计(DUT)向ACE呈现的端口(来自网表和ACE生成的IP文件)的一致性,该流程可用于在进行布局布线前,调试任何端口命名不匹配问题。
以下详细介绍这两种方法:
DSM DC接口
DSM为每个DCI端口提供一个SystemVerilog接口,可用接口如下表所示:
表46 • DSM直连接口
| GDDR6 | gddr6_6_dc0 | East 2 | 0 | t_ACX_AXI4 | 512 | 33 |
| GDDR6 | gddr6_6_dc1 | East 2 | 1 | t_ACX_AXI4 | 512 | 33 |
| DDR4 | ddr4_dc0 | South | – | t_ACX_AXI4 | 512 | 40 |
| Ethernet | ethernet_0_dc | North West | – | t_ACX_ETHERNET_DCI | – | – |
| Ethernet | ethernet_1_dc | North East | – | t_ACX_ETHERNET_DCI | – | – |
| Serdes | serdes_eth0_q0_dc | North West | – | t_ACX_SERDES_DCI | 128 | – |
| Serdes | serdes_eth0_q1_dc | North West | – | t_ACX_SERDES_DCI | 128 | – |
| Serdes | serdes_eth1_q0_dc | North East [^2] | – | t_ACX_SERDES_DCI | 128 | – |
| Serdes | serdes_eth1_q1_dc | North East [^2] | – | t_ACX_SERDES_DCI | 128 | – |
表注:
注:并非所有接口在所有器件中都可用,请查阅相应的器件数据手册,了解所选器件中存在的接口。
直接连接到DSM接口
若要连接到这些接口中的任何一个,需在测试平台中创建信号,并将其作为被测设计(DUT)的端口,同时将该信号连接到DSM(使用DSM实例名称、《DSM直连接口》表格中的接口名称和元素名称)。
以下示例展示了如何连接GDDR AXI接口的awready和awvalid信号:
// Declare the signals in the testbench
// Note : In order to switch between port binding file and direct connect easily, the
signal
// names must match the DUT IO port names.
logic dut_awready;
logic dut_awvalid;
// Connect to the DSM GDDR_1, DC port 0.
// awready is an output from the DSM, and an input to the DUT
assign dut_awready = `ACX_DEVICE_NAME.interfaces.gddr6_1_dc0.awready;
// awvalid is an input to the DSM, and an output from the DUT
assign `ACX_DEVICE_NAME.interfaces.gddr6_1_dc0.awready = dut_awvalid;
// Instantiate the DUT
my_design DUT (
……
.dut_awready (dut_awready),
.dut_awvalid (dut_awvalid),
……
);
通过端口绑定文件连接到DSM接口
若要使用端口绑定文件,需在测试平台中进行以下配置:
创建ACE项目(此阶段不需要网表);
配置所有接口子系统IP;
生成子系统IP文件,包括名为<design_name>_user_design_port_bindings.svh的文件;
在测试平台中声明信号,信号名称必须与被测设计(DUT)上的端口名称相同(因为端口绑定文件使用这些名称);
在测试平台中包含端口绑定文件;
指示DSM将其所有DC接口设置为仅监控模式,这一点至关重要——否则DSM会从可编程逻辑区向子系统驱动端口,同时被测设计(DUT)通过绑定文件驱动相同的端口,可能导致信号未解析和仿真失败。启用定义ACX_DSM_INTERFACES_TO_MONITOR_MODE时,DSM DC接口设置为监控模式。
注:
-
Achronix参考设计流程中,生成的子系统IP文件保存到/src/ioring目录,而非默认的/src/ace/ioring_design目录;
-
定义ACX_DSM_INTERFACES_TO_MONITOR_MODE必须包含在仿真命令行中,确保编译DSM时该定义存在,不能包含在用户测试平台中(因为用户测试平台在DSM之后编译);
-
Achronix参考设计流程中,ACX_DSM_INTERFACES_TO_MONITOR_MODE定义在/sim/<simulator>/system_files_bfm.f和/sim/<simulator>/system_files_rtl.f文件中。
以下示例展示了如何使用端口绑定文件连接被测设计(DUT)的所有端口:
system_files_bfm.f:
# ———————————————————————
# Description : DSM full-chip BFM simulation filelist
# ———————————————————————
# Set whether the DSM DCI interfaces are set to monitor mode only
+define+ACX_DSM_INTERFACES_TO_MONITOR_MODE
Testbench:
// In the testbench
// Declare ALL the DUT signals
logic dut_awready, dut_awvalid ….. ;
// Include the port binding file
`include "../../src/ioring/my_design_user_design_port_bindings.svh"
// Instantiate the DUT
my_design DUT (
……
.dut_awready (dut_awready),
.dut_awvalid (dut_awvalid),
……
);
双模式连接到DSM接口
由于端口绑定方法需要一个定义,可在测试平台中使用该定义在两种连接方法之间切换,该功能支持两种流程,只需启用或禁用该定义即可切换,支持两种方法的测试平台示例如下:
// Declare the signals in the testbench
// Note : In order to switch between port binding file and direct connect easily, the
signal
// names must match the DUT IO port names.
logic dut_awready;
logic dut_awvalid;
// The options below support connect to the DSM DC ports either by using the ACE
generated
// port binding file, or else using the DSM DC Interfaces.
`ifdef ACX_DSM_INTERFACES_TO_MONITOR_MODE
`include "../../src/ioring/my_design_user_design_port_bindings.svh"
`else
assign dut_awready = `ACX_DEVICE_NAME.interfaces.gddr6_1_dc0.awready;
assign `ACX_DEVICE_NAME.interfaces.gddr6_1_dc0.awready = dut_awvalid;
`endif
// Instantiate the DUT
my_design DUT (
……
.dut_awready (dut_awready),
.dut_awvalid (dut_awvalid),
……
);
时钟频率
除了与接口绑定外,还可以控制这些接口生成的时钟频率。为保证设计完整性,仿真中设置的时钟频率应与设计期望的工作频率匹配。在设计实现阶段,频率会在ACE I/O设计器中配置;而在仿真中,可通过set_clock_period函数进行设置。
以下示例展示了将GDDR6东1控制器的工作频率设置为1GHz(适用于16Gbps工作模式)。由于直连(DC)接口的工作频率为控制器频率的一半,因此其配置为500MHz。通过该方法,首先能确保仿真在正确的频率下运行,其次可保证每个子系统能根据需要工作在不同频率。
// Set default GDDR6 clock frequency to 1000 ps = 1GHz
localparam GDDR6_CONTROLLER_CLOCK_PERIOD = 1000;
// Configure the NoC interface of GDDR6 E1 to 1GHz
`ACX_DEVICE_NAME.clocks.set_clock_period("gddr6_5_noc0_clk",
GDDR6_CONTROLLER_CLOCK_PERIOD);
// Configure the DC interface of GDDR6 E1 to 500MHz, (double the period of the NoC
interface)
`ACX_DEVICE_NAME.clocks.set_clock_period("gddr6_5_dc0_clk",
GDDR6_CONTROLLER_CLOCK_PERIOD*2);
注:set_clock_period函数位于设备仿真模型(DSM)中,该模型的默认时间尺度为1皮秒。因此,无论调用模块的时间尺度如何,指定的时钟周期均以皮秒为单位。
可用的时钟频率接口如下表所示:
表47 • 时钟频率接口
| GDDR6 | gddr6_0_noc0_clk [^3] | West 0 NoC | 0 |
| GDDR6 | gddr6_0_noc1_clk [^3] | West 0 NoC | 1 |
| GDDR6 | gddr6_1_noc0_clk [^3] | West 1 NoC | 0 |
| GDDR6 | gddr6_1_noc1_clk [^3] | West 1 NoC | 1 |
| GDDR6 | gddr6_2_noc0_clk [^3] | West 2 NoC | 0 |
| GDDR6 | gddr6_2_noc1_clk [^3] | West 2 NoC | 1 |
| GDDR6 | gddr6_3_noc0_clk | West 3 NoC | 0 |
| GDDR6 | gddr6_3_noc1_clk | West 3 NoC | 1 |
| GDDR6 | gddr6_4_noc0_clk | East 0 NoC | 0 |
| GDDR6 | gddr6_4_noc1_clk | East 0 NoC | 1 |
| GDDR6 | gddr6_5_noc0_clk | East 1 NoC | 0 |
| GDDR6 | gddr6_5_noc1_clk | East 1 NoC | 1 |
| GDDR6 | gddr6_6_noc0_clk | East 2 NoC | 0 |
| GDDR6 | gddr6_6_noc1_clk | East 2 NoC | 1 |
| GDDR6 | gddr6_7_noc0_clk | East 3 NoC | 0 |
| GDDR6 | gddr6_7_noc1_clk | East 3 NoC | 1 |
| GDDR6 | gddr6_1_dc0_clk | West 1 DCI | 0 |
| GDDR6 | gddr6_1_dc1_clk | West 1 DCI | 1 |
| GDDR6 | gddr6_2_dc0_clk | West 2 DCI | 0 |
| GDDR6 | gddr6_2_dc1_clk | West 2 DCI | 1 |
| GDDR6 | gddr6_5_dc0_clk | East 1 DCI | 0 |
| GDDR6 | gddr6_5_dc1_clk | East 1 DCI | 1 |
| GDDR6 | gddr6_6_dc0_clk | East 2 DCI | 0 |
| GDDR6 | gddr6_6_dc1_clk | East 2 DCI | 1 |
| DDR4 | ddr4_noc0_clk | South NoC | – |
| DDR4 | ddr4_dci0_clk | South DCI | – |
| DDR5 | ddr5_noc0_clk [^4] | South NoC | – |
| PCIe | pciex16_clk [^3] | Gen5 PCIe ×16 | – |
| PCIe | pciex16_dc_clk | Gen5 PCIe ×16 DCI | – |
| PCIe | pciex8_clk | Gen5 PCIe ×8 | – |
| Ethernet | ethernet_ref_clk [^3] | Ethernet reference clock [^2] | – |
| Ethernet | ethernet_ff0_clk [^3] | Ethernet FIFO 0 clock [^2] | – |
| Ethernet | ethernet_ff1_clk [^3] | Ethernet FIFO 1 clock [^2] | – |
| Configuration | cfg_clk | System wide configuration clock | – |
表注
配置
多个接口子系统在加电时需要进行配置。在物理器件中,该配置会通过比特流预编程相关配置寄存器完成;而在仿真环境中,可通过相关任务读取配置文件并将其应用到对应的接口子系统。配置应用的代码示例如下:
// ————————-
// Configuration
// ————————-
// Call function within device to configure the registers
// By using fork-join, the two configurations will be run in parallel, configuring both
// Ethernet blocks. This saves overall simulation time.
// Both blocks are configured the same, hence the use the same file
initial
begin
fork
`ACX_DEVICE_NAME.fcu.configure( "ethernet_cfg.txt", "ethernet0" );
`ACX_DEVICE_NAME.fcu.configure( "ethernet_cfg.txt", "ethernet1" );
join
end
启动序列
在fcu.configure()任务处理配置的过程中(包括等待轮询返回有效值的阶段),芯片状态输出信号不会置位。该行为与物理器件的实际情况一致:器件仅在配置完成后,才会进入用户模式。
仿真测试平台可按上述代码片段执行配置流程,当芯片状态输出信号置位时,测试平台即可确认器件已完成正确配置,进而开展后续的测试工作。
fcu.configure()任务
fcu.configure任务的参数定义如下:
fcu.configure ( <configuration filename>, <interface subsystem name> );
支持的接口子系统名称如下表所示:
表48 • 配置子系统名称
| GDDR6 | gddr6_0 | West 0 |
| GDDR6 | gddr6_1 | West 1 |
| GDDR6 | gddr6_2 | West 2 |
| GDDR6 | gddr6_3 | West 3 |
| GDDR6 | gddr6_4 | East 0 |
| GDDR6 | gddr6_5 | East 1 |
| GDDR6 | gddr6_6 | East 2 |
| GDDR6 | gddr6_7 | East 3 |
| DDR4 | ddr4 | South |
| DDR5 | ddr5 | South |
| Ethernet | ethernet0 | North |
| Ethernet | ethernet1 | North |
| GPIO North | gpio_n | North |
| GPIO South | gpio_s | South |
| PCIe ×8 | pcie_0 | North |
| PCIe ×16 | pcie_1 | North |
| All subsystems | full [^2] | – |
表注
配置文件格式
配置文件采用以下格式:
# ——————————————
# Configuration file
# Supports both # and // comments
# ——————————————
# A comment line
// Another comment line
# Format is <cmd> <addr> <data>
# Commands are
"w" – write
"r" – read
"v" – read and verify
"d" – Wait for the number of cycles in the data field.
The address field is unused
# Address is either 28-bit, (7 hex characters), or 42-bit, (11 hex characters).
# 28-bits supports the configuration memory space of an single interface subsystem
# 42-bits supports the full configuration memory space
# Data is 32-bit, (8 hex characters).
# For reads, put 0x0 for the data
# For verify put the expected data value
# Examples
# Writes
w 00005c0 76543210
w 0000014 00004064
# Reads
r 00005c0 00000000
r 0000014 00000000
# Verify
v 00005c0 76543210
v 0000014 00004064
# Wait for 50 cycles
d 0000000 00000032
地址宽度
地址宽度根据文件的使用需求有所不同:
-
寻址单个子系统时,仅使用地址字段的低28位,高14位由子系统名称推导得出;
-
寻址完整的配置存储空间(接口子系统名称设为full)时,需要42位地址空间。该模式下,现场配置单元(FCU)会验证地址字段的[41:34]位是否设为8’h20,该值与二维片上网络(2D NoC)全局内存映射及控制状态寄存器(CSR)存储区对齐。通过该模式,单个配置文件可寻址多个接口子系统,更多细节请参考Speedster7t片上网络用户指南(UG089)。
并行配置
fcu.configure()任务被定义为SystemVerilog自动任务,支持可重入并能并行运行。因此,可通过fork – join结构对多个接口子系统进行并行编程,参考设计的测试平台中包含该并行编程的示例。
SystemVerilog接口
定义了以下SystemVerilog接口,用于直连接口(DCI)的信号分配。
注:以下接口仅在仿真环境中可用。对于需要综合的代码,需自定义SystemVerilog接口,或使用参考设计中预定义的接口之一。
interface t_ACX_AXI4
#(DATA_WIDTH = 0,
ADDR_WIDTH = 0,
LEN_WIDTH = 0);
logic aclk; // Clock reference
logic awvalid; // AXI Interface
logic awready;
logic [ADDR_WIDTH -1:0] awaddr;
logic [LEN_WIDTH -1:0] awlen;
logic [8 -1:0] awid;
logic [4 -1:0] awqos;
logic [2 -1:0] awburst;
logic awlock;
logic [3 -1:0] awsize;
logic [3 -1:0] awregion;
logic [3:0] awcache;
logic [2:0] awprot;
logic wvalid;
logic wready;
logic [DATA_WIDTH -1:0] wdata;
logic [(DATA_WIDTH/8) -1:0] wstrb;
logic wlast;
logic arready;
logic [DATA_WIDTH -1:0] rdata;
logic rlast;
logic [2 -1:0] rresp;
logic rvalid;
logic [8 -1:0] rid;
logic [ADDR_WIDTH -1:0] araddr;
logic [LEN_WIDTH -1:0] arlen;
logic [8 -1:0] arid;
logic [4 -1:0] arqos;
logic [2 -1:0] arburst;
logic arlock;
logic [3 -1:0] arsize;
logic arvalid;
logic [3 -1:0] arregion;
logic [3:0] arcache;
logic [2:0] arprot;
logic aresetn;
logic rready;
logic bvalid;
logic bready;
logic [2 -1:0] bresp;
logic [8 -1:0] bid;
modport initiator (input awready, bresp, bvalid, bid, wready, arready, rdata,
rlast, rresp, rvalid, rid,
output awaddr, awlen, awid, awqos, awburst, awlock, awsize,
awvalid, awregion, bready, wdata, wlast, rready, wstrb, wvalid,
araddr, arlen, arid, arqos, arburst, arlock, arsize,
arvalid, arregion);
modport responder (output awready, bresp, bvalid, bid, wready, arready, rdata,
rlast, rresp, rvalid, rid,
input awaddr, awlen, awid, awqos, awburst, awlock, awsize,
awvalid, awregion,
bready, wdata, wlast, rready, wstrb, wvalid,
araddr, arlen, arid, arqos, arburst, arlock, arsize,
arvalid, arregion);
modport monitor (input awready, bresp, bvalid, bid, wready, arready, rdata,
rlast, rresp, rvalid, rid,
awaddr, awlen, awid, awqos, awburst, awlock, awsize,
awvalid, awregion, awprot, awcache,
bready, rready, wstrb, wvalid, wdata, wlast,
araddr, arlen, arid, arqos, arburst, arlock, arsize,
arvalid, arregion, arprot, arcache);
endinterface : t_ACX_AXI4
环境变量
ACE和仿真包的路径由两个环境变量控制,在运行所有参考设计的仿真前,必须设置这两个变量。
ACE_INSTALL_DIR
环境变量ACE_INSTALL_DIR必须设置为ace(Linux系统)或ace.exe(Windows系统)可执行文件所在的目录。该变量会被仿真和综合流程共同使用,用于定位正确的器件库文件。
ACX_DEVICE_INSTALL_DIR
可选环境变量ACX_DEVICE_INSTALL_DIR用于选择设备仿真模型(DSM)文件,应设置为DSM包中器件文件的完整路径(包含基础目录)。
-
以ACE集成模式安装时,按如下方式设置(以Speedster7t AC7t1500 FPGA为例):
ACX_DEVICE_INSTALL_DIR = $ACE_INSTALL_DIR/system/data/AC7t1500
-
以独立模式安装时,按如下方式设置(以Speedster7t AC7t1500 FPGA为例):
ACX_DEVICE_INSTALL_DIR = <location of standalone package>/system/data/AC7t1500
仅当DSM未以ACE集成模式安装时,仿真才需要设置ACX_DEVICE_INSTALL_DIR变量。在所有提供的参考设计中,仿真Makefile会按ACE集成模式的方式定义该变量,该定义优先级高于本地环境变量。若使用提供的仿真Makefile,可通过如下方式在Make流程调用中覆盖ACX_DEVICE_INSTALL_DIR的定义(以Speedster7t AC7t1500 FPGA为例):
> make ACX_DEVICE_INSTALL_DIR=<location of standalone package>/system/data/AC7t1500
官网:www.achronix.com
所发布的内容经achronix官方允许
参考设计完整工程在个人下载中心,可根据个人需求前往下载,如有问题可私信博主

![[特殊字符]DeepSeek‑Harness(DSH)小白保姆教程-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260816085112-6a817a009aabf-220x150.png)
