Speedster7t PCIe-gen5 超全实战指南,解锁 FPGA + 存储高速交互核心玩法
Speedster7t、pcie-gen5、AC7t1500、GDDR6、DMA
想让 FPGA 的 PCIe×8/×16 接口与 GDDR6、DDR4 实现无缝高速交互?想掌握既能快速验证性能、又能做到周期级精准的仿真技巧?Achronix 这款 Speedster7t PCIe-gen5 参考设计,藏着 AC7t1500 器件片上网络(NoC)的核心设计逻辑,从仿真模式切换到实际工程实现,从 DMA 传输到寄存器精细控制,全流程实战细节一次讲透,看完直接上手硬核 FPGA 高速接口设计!
引言
Speedster®7t PCIe参考设计展示了如何生成进出FPGA架构以及内存子系统的PCIe输入和输出流量。本设计演示了片上网络(NoC)将PCIe×8和PCIe×16接口与FPGA架构中的逻辑(包括所有GDDR6通道和DDR4接口)相连接的方式。同时还展示了如何通过PCIe接口对AC7t1500上的各类内存子系统执行内存读写操作、对FPGA架构中的块随机存取存储器(BRAM)进行读写,以及对FPGA架构中的寄存器文件空间开展读写。此外,该参考设计还实现了FPGA架构中的主逻辑向PCIe×8和PCIe×16接口发起事务处理。两个PCIe接口可并行工作,能向内存子系统和FPGA内核中的逻辑发送事务;同理,FPGA架构中的主逻辑也可向任一PCIe接口发送事务。本设计的FPGA内核逻辑目标工作频率为500MHz。
仿真
本设计可通过两种模式之一进行仿真:
-
BFM 模式——该模式下,设计采用总线功能模型(BFM)对PCIe子系统进行建模,PCIe部分的仿真并非周期精确。但测试平台可用于一些初步的性能测量,例如在理想PCIe环境下测试最大流量吞吐量,或测试与各目标节点间的延迟。PCIe总线功能模型包含可调用的SystemVerilog任务,用于发起直接内存访问(DMA)读写、寄存器读写,以及响应从FPGA架构发起的事务处理。
-
RTL 模式——该模式下,仿真采用器件内部完整PCIe子系统的加密寄存器传输级(RTL)代码,因此仿真是周期精确的,能精准还原器件的实际工作状态。此仿真需要借助PCIe根复合体的仿真模型,以实现与器件内部PCIe端点的接口和配置。在本设计中,使用的是新思科技(Synopsys)的PCIe验证IP(VIP)(另见相关说明)。此外,还需从Achronix获取包含PCIe寄存器传输级代码的相应器件仿真模型(DSM)包,可通过发送邮件至support@achronix.com申请该包。
注
在总线功能模型仿真模式下,本参考设计不支持任何PCIe协议或物理接口(PIPE),也无法访问PCIe配置寄存器。默认情况下,本PCIe参考设计的两个PCIe接口以及GDDR6和DDR4子系统均配置为使用总线功能模型,同时也可启用PCIe接口或任一内存子系统的寄存器传输级仿真,有关启用寄存器传输级模型的详细说明见启用RTL仿真模型章节。
警告
为任一PCIe子系统或内存子系统启用寄存器传输级模式,均会大幅增加仿真时间。
核心设计
本参考设计演示了如何在新设计中实现PCIe接口、FPGA架构和内存子系统之间的连接。FPGA架构中的核心设计不会随仿真模式的变化而改变,仿真模式仅会将用户设计周边的接口子系统从总线功能模型切换为完整的寄存器传输级代码,不会对核心设计产生影响。切换仿真模式会改变仿真的周期精确性,但不会影响功能行为。这种设计方法允许开发者借助所有接口子系统的总线功能模型模式快速开发设计;若有需要,可运行周期精确的寄存器传输级仿真,以全面验证设计的完整性。
设计说明
本参考设计包含用于仿真的测试平台,以及在AC7t1500器件中实现该设计的脚本。
如前所述,PCIe参考设计有总线功能模型和寄存器传输级两种仿真模式,每种模式对应的测试平台各不相同,但均在单个SystemVerilog源文件tb_pcie_ref_design.sv中定义,以下将详细介绍这些测试平台的架构。
总线功能模型模式下,与FPGA交互的PCIe IP和根复合体的功能均由总线功能模型建模。测试过程会调用在PCIe×8和PCIe×16主、从总线功能模型中定义的SystemVerilog任务,测试平台的结构如下图1所示:
图1:PCIe参考设计总线功能模型模式测试平台框图
寄存器传输级模式下,使用新思科技的PCIe验证IP对根复合体(RC)进行建模,实例化两个根复合体,分别与FPGA中的PCIe×8和PCIe×16子系统进行交互,如下图2所示:
图2:PCIe参考设计寄存器传输级模式测试平台框图
两种模式下,FPGA内部的设计保持一致,均对两个PCIe接口、内存子系统和FPGA架构之间的不同连接进行测试验证。设计的所有部分均使用随机生成器和检查器生成数据,并对所有响应执行自校验对比。
注
本PCIe参考设计仅支持全芯片总线功能模型或寄存器传输级仿真流程,不支持独立仿真流程。
至内存子系统的DMA流量
PCIe接口、GDDR6通道和DDR4接口均与片上网络相连,并通过高级可扩展接口(AXI)事务实现相互间的通信。测试平台生成随机数据,采用递增地址和增大突发长度的方式向所有内存子系统写入数据,同时通过调用任务来发送和接收事务。调用读写任务时,可通过片上网络的全局地址空间指定目标GDDR6或DDR4端口。测试平台中的对比任务会检查返回的读取数据是否与写入的预期数据模式一致。
至FPGA架构中BRAM的DMA流量
与内存子系统事务类似,PCIe接口可向位于FPGA架构中的BRAM响应器发送事务,本参考设计通过片上网络与架构建立连接。BRAM响应器逻辑与片上网络某一列的AXI主网络访问点相连,FPGA架构中的逻辑接收来自PCIe接口的AXI事务,并将数据写入BRAM;执行读取事务时,BRAM会从指定地址返回读取数据。具体而言,BRAM响应器i_axi_bram_rsp1接收来自PCIe×8接口的事务,而BRAM响应器i_axi_bram_rsp2接收来自PCIe×16接口的事务。两个BRAM响应器均位于特定的网络访问点位置,相关位置信息可在测试平台的bind语句以及实现所用的ace_placements.pdc文件中找到,用户也可根据需要修改具体的网络访问点位置。测试平台通过调用任务发起读写事务,并检查返回数据是否与写入BRAM的数据一致。
至FPGA架构的寄存器读写
本参考设计在FPGA架构中包含多种不同类型的寄存器,PCIe接口可向这些寄存器发送读写事务,这些寄存器执行各类任务并与某一列的AXI主网络访问点相连。具体而言,寄存器组i_axi_nap_reg_set1接收来自PCIe×8接口的事务,寄存器组i_axi_nap_reg_set2接收来自PCIe×16接口的事务。寄存器组位于测试平台bind语句和实现所用ace_placements.pdc文件中指定的特定网络访问点位置,用户可根据需要修改该位置。测试平台调用相应任务发起事务,并将返回数据与预期数据对比,判断是否一致。设计中提供的寄存器类型如下:
- 8个32位可读写寄存器;
- 8个32位只读寄存器,每个寄存器均被设置为固定的已知值(地址加偏置值);
- 2个32位计数器寄存器及2个控制寄存器(1个递增计数器、1个递减计数器,每个计数器各配1个用于启动、停止和清零的控制寄存器,共4个寄存器);
- 3个中断(IRQ)模拟寄存器:2个中断寄存器(可直接写入或随机设置)和1个中断主寄存器。向特定中断寄存器位写入数据时,相应位会被清零;若任一中断位被置1,中断主寄存器将被置1(实际为所有中断位的或操作);
- 1个读清零寄存器,向该32位寄存器写入数据可置位相应位,执行读取操作时所有32位均会被清零,即对该寄存器的第二次读取将返回全零;
- 4个64位可读写寄存器。
FPGA主逻辑至PCIe的事务
FPGA中的主逻辑可向PCIe从接口发送事务。本参考设计在FPGA架构中设置了两个主逻辑模块,每个模块均生成随机数据,并采用递增地址和增大突发长度的方式传输。每个模块均与一个AXI从网络访问点相连,由该访问点向PCIe接口发送事务。其中,主逻辑模块i_pcie16_axi_gen_chk向PCIe×16接口发送事务,另一个模块i_pcie8_axi_gen_chk向PCIe×8接口发送事务。
主逻辑模块位于测试平台bind语句和实现所用ace_placements.pdc文件中指定的特定网络访问点位置,用户可根据需要修改该位置。
总线功能模型模式下,测试平台通过调用任务检查相应PCIe从总线功能模型中的读写请求。get_write_request任务处理写入请求,捕获数据并将其存储在字节数组中,随后测试平台调用issue_write_response任务,表示写入事务已成功完成。FPGA中的检查器逻辑向PCIe从设备发送读取事务,测试平台调用get_read_request和issue_read_response任务,将读取数据返回至FPGA架构中的检查器。检查器逻辑使用与向PCIe从设备发送写入事务的生成器逻辑相同的数据模式,在接收读取数据时,将接收到的数据与预期数据进行对比。
寄存器传输级模式下,根复合体验证IP会自动处理来自FPGA中相同数据生成器和检查器逻辑的传入读写访问,以完成功能测试。
测试平台环境
SystemVerilog任务
总线功能模型模式下,仿真测试平台调用多个高级任务,实现与PCIe接口间的双向连接,可用任务如下表1所示:
表1:总线功能模型模式下的PCIe任务
| Signal Name | Direction | Width | Description |
|---|---|---|---|
| write_dma: | PCIe master task for writing to memory subsystems, or BRAMs in the FPGA fabric. Must be preceded by task to set set_blocking_transaction_id the AXI transaction ID. | ||
| byte_addr | Input | 41:0 | Starting byte address of the transaction, must be aligned on 64-byte boundary. |
| num_bytes | Input | 31:0 | Number of bytes in the transfer, maximum transfer is 2 −1. 32 |
| data[int] | Input | 7:0 | Pointer to the first byte of write data; this is an array of bytes. |
| resp | Output | 1:0 | The response to the transaction (AXI bresp): 2’b00 = transaction succeeded 2’b01 = task error (arguments illegal or timed out) 2’b10 = slave error (error returned by slave) 2’b11 = decode error (destination address is not valid) |
| read_dma: | PCIe master task for reading from memory subsystems, or BRAMs in the FPGA fabric. Must be preceded by task set_blocking_transaction_id to set the AXI transaction ID. | ||
| byte_addr | Input | 41:0 | Starting byte address of the transaction, must be aligned on 64-byte boundary. |
| num_bytes | Input | 31:0 | Number of bytes in the transfer, maximum transfer is 2 −1. 32 |
| data[int] | Output | 7:0 | Pointer to the first byte of read data, this is an array of bytes. |
| resp | Output | 1:0 | The response to the transaction (AXI rresp): 2’b00 = transaction succeeded 2’b01 = task error (arguments illegal or timed out) 2’b10 = slave error (error returned by slave) 2’b11 = decode error (destination address is not valid) |
| write: | PCIe master task for writing to register space or other slave logic in the FPGA fabric or CSR space. Must be preceded by task to set the AXI transaction ID. set_blocking_transaction_id | ||
| byte_addr | Input | 41:0 | Starting byte address of the transaction, must be aligned on the transfer size boundary, for example a 4-byte transfer must be aligned on a 4-byte boundary. |
| data[int] | Input | 7:0 | Pointer to the first byte of write data, this is an array of bytes. |
| num_bytes | Input | 31:0 | Number of bytes in the transfer, minimum value is 4 bytes, maximum value is 512 bytes for PCIex16, 1024 for PCIex8. |
| resp | Output | 1:0 | The response to the transaction (AXI bresp): 2’b00 = transaction succeeded 2’b01 = task error (arguments illegal or timed out) 2’b10 = slave error (error returned by slave) 2’b11 = decode error (destination address is not valid) |
| read: | PCIe master task for reading from register space or other slave logic in the FPGA fabric or CSR space. Must be preceded by task to set the AXI transaction ID. set_blocking_transaction_id | ||
| byte_addr | Input | 41:0 | Starting byte address of the transaction, must be aligned on the transfer size boundary, for example a 4-byte transfer must be aligned on a 4-byte boundary. |
| num_bytes | Input | 31:0 | Number of bytes in the transfer, minimum value is 4 bytes, maximum value is 512 bytes for PCIex16, 1024 for PCIex8. |
| data[int] | Output | 7:0 | Pointer to the first byte of read data, this is an array of bytes. |
| resp | Output | 1:0 | The response to the transaction (AXI rresp): 2’b00 = transaction succeeded 2’b01 = task error (arguments illegal or timed out) 2’b10 = slave error (error returned by slave) 2’b11 = decode error (destination address is not valid) |
| get_write_request: | PCIe slave task, waits for write request from FPGA fabric or other master and captures write address, write data, and AXI transaction ID. | ||
| byte_addr | Output | 41:0 | Starting byte address for the write request. |
| num_bytes | Output | 31:0 | Number of bytes in the transfer. |
| data[int] | Output | 7:0 | Pointer to the first byte of write data, this is an array of bytes. |
| id | Output | 7:0 | AXI transaction ID. |
| issue_write_response: | PCIe slave task, sends a write response to the preceding write transaction. | ||
| resp | Input | 1:0 | The response to the AXI write transaction (AXI bresp). |
| id | Input | 7:0 | AXI transaction ID (same ID returned from the task). get_write_request |
| get_read_request: | PCIe slave task, waits for read request from FPGA fabric or other master and captures the read address, length of transfer, and AXI transaction ID. | ||
| byte_addr | Output | 41:0 | Starting byte address for the read request received. |
| num_bytes | Output | 31:0 | Number of bytes in the transfer. |
| id | Output | 7:0 | AXI transaction ID. |
| issue_read_response: | PCIe slave task, sends read response to the preceding read request includes read data of the correct transfer length. | ||
| num_bytes | Input | 31:0 | Number of bytes in the read transfer, use the received from num_bytes task. get_read_request |
| data[int] | Input | 7:0 | Pointer to the first byte of read data, this is an array of bytes. |
| resp | Input | 1:0 | The response to the transaction (AXI rresp). |
| id | Input | 7:0 | AXI transaction ID (same ID returned from the get_read_request task). |
| set_blocking_transaction_id: | PCle master task, sets the AXI transaction ID for the subsequent blocking AXI transaction(s). | ||
| transaction_id | Input | 7:0 | Sets the AXI transaction ID to be used by the subsequent blocking transactions, can optionally use to set the transaction ID but not required. |
| wait_cycles: | Wait a number of PCle cycles before proceeding to the next task. This task allows the testbench to keep PCle BFM tasks aligned with the corresponding PCle clock. | ||
| num_cycles | Input | 31:0 | The total number of PCle cycles to advance the clock. |
寄存器传输级模式下,仿真测试平台调用多个高级任务驱动根复合体验证IP的行为,可用任务如下表2所示:
表2:寄存器传输级模式下的PCIe任务
| Signal Name | Direction | Width | Description |
|---|---|---|---|
| MemRandWrRdComp0/1: | PCIe VIP acting as RC0/1 issues a command to write a random data payload to the FPGA’s memory space, reads back the data and compares. If read data mismatches write data, an error message is generated. | ||
| address | Input | 63:0 | Starting byte address of the transaction, must be aligned on 64-byte boundary. |
| length_in_dwords | Input | 31:0 | Number of DWORDs in the transfer. This value needs to be greater than 1. |
| tc | Input | 31:0 | Traffic class. |
| NAPRandWrRdComp0/1: | PCIe VIP acting as RC0/1 issues a command to write a random data payload to a specific NoC access point (NAP) in the FPGA, reads back the data and compares. If read data mismatches write data, an error message is generated. | ||
| nap_base | Input | 63:0 | Base address of the NAP. |
| col | Input | 3:0 | Column number of the NAP. |
| row | Input | 2:0 | Row number of the NAP. |
| length_in_dwords | Input | 31:0 | Number of DWORD in the transfer. This value needs to be greater than 1. |
| tc | Input | 31:0 | Traffic class. |
| NAPRandWrRdCompDW0/1: | PCle VIP acting as RC0/1 issues a command to write a single DWORD of random data payload to a specific NAP in the FPGA, reads back the data and compares. If read data mismatches write data, an error message is generated. | ||
| nap_base | Input | 63:0 | Base address of the NAP. |
| col | Input | 3:0 | Column number of the NAP. |
| row | Input | 2:0 | Row number of the NAP. |
| tc | Input | 31:0 | Traffic class. |
| NAPRdCompDW0/1: | PCle VIP acting as RC0/1 issues a command to read a single DWORD from a specific NAP and compare it to the expected value. If read data mismatches expected data, an error message is generated. | ||
| nap_base | Input | 63:0 | Base address of the NAP. |
| col | Input | 3:0 | Column number of the NAP. |
| row | Input | 2:0 | Row number of the NAP. |
| tc | Input | 31:0 | Traffic class. |
| expected_rd_data | Input | 31:0 | Expected value of read data. |
| NAPWrDW0/1: | PCle VIP acting as RC0/1 issues a command to write a single DWORD of data payload to a specific NAP. | ||
| nap_base | Input | 63:0 | Base address of the NAP. |
| col | Input | 3:0 | Column number of the NAP. |
| row | Input | 2:0 | Row number of the NAP. |
| tc | Input | 31:0 | Traffic class. |
| wr_data | Input | 31:0 | Write data. |
| NAPRdDW0/1: | PCle VIP acting as RC0/1 issues a command to read a single DWORD of data from a specific NAP. | ||
| nap_base | Input | 63:0 | Base address of the NAP. |
| col | Input | 3:0 | Column number of the NAP. |
| row | Input | 2:0 | Row number of the NAP. |
| tc | Input | 31:0 | Traffic class. |
| rd_data | Output | 31:0 | Write data. |
| DoInitLinkUpRcEp0/1: | This task establishes a link between the RC0/1 VIP and the FPGA EP. | ||
| model_cfg | Input | class | This is a class that defines the characteristics of the PCle Link to be created. Details of this class are defined in pciesvc_device_serdes_x16_model_config.sv. |
| CheckTestStatus: | This task checks the number of “NOTICE”, “WARNING” and “ERROR” generated by the RC VIP. |
设计架构
本参考设计通过SystemVerilog接口简化每个片上网络访问点的信号,包含AXI4(t_AXI4)接口定义,以及使用该接口实例化相应主/从片上网络访问点的NAP封装文件。该设计架构展示了片上网络访问点在设计中的使用示例;若用户不希望使用SystemVerilog接口,可直接实例化NAP宏,无需使用封装或接口定义。
仿真流程控制
本参考设计支持总线功能模型和寄存器传输级两种仿真模式,可通过编译(make)流程中的开关选择模式并控制仿真过程中的各项选项。
在sim/vcs或sim/questa目录下,运行总线功能模型模式仿真的命令为:
make FLOW=FULLCHIP_BFM
也可直接输入:
make
因为未显式指定FLOW开关时,编译流程默认采用总线功能模型模式。
在sim/vcs或sim/questa目录下,运行寄存器传输级模式仿真的命令为:
make FLOW=FULLCHIP_RTL
也可通过编译流程控制波形转储,禁用波形转储可提升仿真速度,默认情况下波形转储为启用状态。若要禁用,需在make命令中添加WAVE_DUMP=NO开关,示例如下:
make FLOW=FULLCHIP_RTL WAVE_DUMP=NO
启用RTL仿真模型
选择FULLCHIP_RTL流程时,仿真将通过相应仿真目录下的system_files_rtl.f文件,将各个接口子系统配置为总线功能模型或寄存器传输级模式。该文件默认配置为两个PCIe子系统均启用寄存器传输级模式,所有内存子系统保持总线功能模型模式。
默认的FULLCHIP_BFM模式下,仿真使用system_files_bfm.f文件,该文件默认将所有接口子系统(PCIe和内存)均设置为总线功能模型模式。
若要为任一内存子系统启用寄存器传输级仿真模型,需在相应的system_files_xxx.f文件中添加以下宏定义:
# Enable 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
//+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
# Enable the DDR4 memory controller RTL
//+define+ACX_DDR4_FULL
# Turn-on below defines for DDR4 Micron Model
//+define+ACX_USE_MICRON_MODEL
//+define+ACX_DDR4_3200
//+define+DDR4_X8
//+define+DDR4_2G
# Turn-on below defines for DDR4 SKHynix Model
//+define+ACX_USE_HYNIX_MODEL
//+define+DDR4_8Gx8
//+define+DDR4_3200AA
//+define+ACX_DDR4_3200
注
为任一内存子系统启用寄存器传输级仿真时,必须在测试平台中实例化相应的内存器件仿真模型,有关获取和连接这些模型的详细信息,可参考各内存子系统对应的参考设计。
测试平台配置文件(仅RTL模式)
寄存器传输级模式仿真的测试平台中,包含两个配置文件(/sim/Gen5_8lanes_PCIE_0_mem64bit_bitstream0.txt和/sim/Gen5_16lanes_PCIE_1_mem64bit_bitstream0.txt),用于在寄存器传输级仿真模式下配置相应的PCIe内核。
警告
仿真过程中,这些文件指定的配置会跳过PCIe主机到端点的握手过程,直接对基址寄存器(BAR)进行编程,该操作可加快并简化仿真流程。但在实际硬件中,主机仍需在启动时读取PCIe内核的功能特性,并根据这些特性和自身需求配置基址寄存器。
受上述修改影响,这些配置文件必须按提供的版本使用,不可替换为直接从ACE生成的更新文件。本参考设计的后续版本将取消这些修改,允许直接从ACE生成配置文件。
获取并安装Synopsys PCIe VIP(仅RTL模式)
运行寄存器传输级模式仿真,需从新思科技获取PCIe验证IP包和相应授权许可。
注
总线功能模型模式仿真无需使用PCIe验证IP。
获取方式
联系Achronix技术支持,获取新思科技PCIe验证IP授权许可的申请说明。
安装步骤
-
从新思科技下载验证IP包,并解压至指定目录
user_synopsys_pcie_vip_dir,该目录包含所有PCIe验证IP组件; -
设置环境变量DESIGNWARE_HOME,指向
user_synopsys_pcie_vip_dir目录; -
为验证IP设计文件创建新目录(如
user_design_dir),进入该目录并执行以下命令:
$DESIGNWARE_HOME/bin/dw_vip_setup -e pcie_svt/tb_pcie_svt_verilog_basic_sys -svlog
该脚本将在user_design_dir目录下生成一套验证IP工具和测试用例组件;
-
设置环境变量DESIGN_DIR,指向
user_design_dir目录; -
仅适用于明导(Mentor)QuestaSim:定义环境变量MTI_HOME,指向QuestaSim的安装目录。
至此,新思科技PCIe验证IP安装完成。
运行仿真编译文件时,名为make_pli的编译规则将为目标仿真器编译新思科技验证IP。
注
上述两个环境变量(DESIGNWARE_HOME和DESIGN_DIR)在sim/vcs和sim/questa仿真目录下的Makefile、system_files_rtl.f和qsim_pcie_ref_design.do文件中被引用,运行寄存器传输级仿真前,必须在shell中定义这两个变量;若使用Mentor QuestaSim,还需定义MTI_HOME环境变量。
端口定义
以i_开头的端口名为设计的输入端口,以o_开头的为输出端口,本设计中仅有一个时钟信号,具体端口定义如下表3所示:
表3: PCIe参考设计顶层端口
| Signal Name | Width | Description |
|---|---|---|
| i_clk | 1 | Clock for all logic in the FPGA fabric, all logic runs at 500 MHz. |
| i_reset_n | 1 | Active-low reset. |
| i_start | 1 | Indicates the FPGA logic generating AXI transactions can begin. |
| pll_1_lock | 1 | PLL lock signal. |
| o_mstr_test_complete | 1 | Asserts when the master logic has completed its transactions. |
| o_mstr_test_complete_oe | 1 | Output enable for , tied to . o_mstr_test_complete 1’b1 |
| o_fail | 1 | Asserted when read data from PCIe slave does not match the expected data. |
| o_fail_oe | 1 | Output enable for , tied to . o_fail 1’b1 |
设计实现
本参考设计在/src/ace目录下包含一个ACE工程,该工程通过默认配置文件(/axcip/pci_express_x16.acxip和/axcip/pci_express_x8.acxip)配置PCIe子系统。
注:
上述文件中的PCIe IP设置为默认值,与寄存器传输级模式仿真中使用的PCIe IP设置并非完全一致,修改这些设置不会影响仿真结果。
有关仿真中使用的PCIe IP设置文件,可参考《测试平台配置文件(仅寄存器传输级模式)》章节。
时钟配置
工程中通过/acxip/pll_1.acxip文件指定了以下时钟,锁相环由器件的100兆赫兹输入时钟sys_clk_in驱动,具体时钟参数如下表4所示:
表4:时钟频率
| Name | Frequency (MHz) | Description |
|---|---|---|
| noc_clk | 200 | Default clock for the NoC. (^†) |
| pcie_clk | 1000 | PCIe subsystem reference clock. (^†) |
| i_clk | 500 | Fabric core clock. |
表注
† 这些时钟输出直接从参考锁相环连接至相应目标模块,不通过FPGA架构布线,因此无法被用户逻辑使用。
复位源
本设计包含多个复位源,具体说明如下表5所示:
表5:复位源
| Source | Description |
|---|---|
| i_reset_n | External asynchronous input. Pin configuration is specified in . /acxip/gpio_bank_north.acxip |
| pll_1_lock | User clock PLL locked. Provides . i_clk |
良好的设计规范要求对复位信号进行仔细的同步和处理,本参考设计多次实例化reset_processor模块,该模块整合多个复位源,将其正确同步至指定的时钟域,随后对复位信号进行流水线处理,以实现扇出控制和重定时。该模块的输出为每个时钟域对应的同步复位信号。
设计中为片上网络电路实例化了7个reset_processor模块,以i_reset_n和锁相环锁定信号为输入,为每个片上网络访问点生成与i_clk同步的复位信号(nap_rstn[6:0])。
参考设计安装
下载
该设计可从Achronix自助FTP站点(https://secure.achronix.com)下载,存放路径为/public/Achronix/Reference_Designs/Speedster7t。
包格式
设计以ZIP压缩包形式提供,命名格式为:
<design_name><design_version><date_of_packaging>.zip
压缩包包含所有源代码、设计构建脚本、仿真脚本文件,以及可选的图形界面(GUI)工程文件;此外,压缩包根目录包含发布说明,记录设计的版本更新历史。
操作系统支持
Linux系统
设计脚本和构建流程基于Linux系统原生开发,已在CentOS 7和Ubuntu 16.04LTS系统中完成构建和测试。流程采用Makefile编写,与Linux的shell类型无关。
Windows系统
要在Windows 10系统中运行脚本化的仿真或实现流程,用户需安装以下任一工具:
-
Windows下的Linux环境(如cygwin.com),安装时需包含Tcl解释器和make可执行文件;
-
适用于Windows的Tcl解释器和make可执行文件,有免费和商业授权等多种版本可选。
若用户无法安装上述工具,仍可在Windows系统中运行部分流程:
-
实现流程:提供Synplify和ACE的图形界面工程,可直接通过工具的图形界面完成构建;
-
仿真流程:提供可在QuestaSim Tcl控制台中执行的Tcl脚本,支持在Windows系统中通过QuestaSim进行仿真,详细信息见《仿真》章节。
注
为保证脚本流程正常运行,ACE需安装在路径名无空格的目录中(如C:\achronix\8.3\Achronix_CAD_Environment);此外,环境变量ACE_INSTALL_DIR需使用“/”作为路径分隔符,而非“\”,示例如下:ACE_INSTALL_DIR = C:/achronix/8.3/Achronix_CAD_Environment/Achronix
工具版本要求
本设计所有测试均基于以下工具版本完成,具体要求如下表6所示:
表6:最低工具版本
| Software | Version |
|---|---|
| ACE | 8.3.3 |
| Device Simulation Model | 8.3.3 |
| Synplify Pro | R-2020.09X-SP1 |
| Mentor Questa | 10.7c-1 |
| Synopsys VCS | O-2018.09-SP1-1 |
环境变量
ACE_INSTALL_DIR
为支持工程的可重定位性,设计使用环境变量ACE_INSTALL_DIR,该变量需指向ACE的安装目录(ace或ace.exe的安装路径),综合和仿真过程均通过该变量定位正确的ACE库文件。
注
为保证脚本流程正常运行,ACE必须安装在路径名无空格的目录中,示例路径如下:
-
Windows:
C:\achronix\8.3\Achronix_CAD_Environment -
Linux:
/opt/achronix/ace/8.3
此外,Windows系统中安装时,环境变量ACE_INSTALL_DIR需使用“/”作为路径分隔符,而非“\”,示例如下:
ACE_INSTALL_DIR = C:/achronix/8.3/Achronix_CAD_Environment/Achronix
目录结构
本设计的目录结构便于导航和区分源文件与生成文件,用户可根据自身需求修改目录结构,但修改后需同步调整相应的Makefile和构建脚本。为保证可移植性,设计中使用相对路径而非绝对路径,并通过环境变量指定根目录,具体目录结构如下表7所示:
表7:设计目录结构
| Directory | Decription |
|---|---|
| <design_name> | Root directory. Contains release notes. |
| /build | Synthesis and place-and-route building |
| /doc | Documentation and user guide |
| /scripts | Scripts used for building and simulation |
| /sim | Simulation area |
| /vcs | Synopsys VCS simulation files |
| /questa | Mentor QuestaSim simulation files |
| /src | Source code |
| /ace | ACE GUI project |
| /acxip | ACE .acxip configuration files |
| /constraints | Placement and timing constraint files |
| /include | RTL include files |
| /ioring | ACE generated ioring files |
| /rtl | RTL source files |
| /syn | Synplify Pro GUI project |
| /tb | RTL testbench files |
| filelist.tcl | Filelist used for building and simulation |
语言支持
本参考设计支持Verilog、SystemVerilog和VHDL三种寄存器传输级语言,可用于设计构建和独立仿真。若使用全芯片总线功能模型仿真,要求顶层测试平台为Verilog或SystemVerilog语言,但被测设计(DUT)可使用VHDL语言编写。
约束文件
设计在/src/constraints目录下提供了完整的约束文件集,演示了如何为设计应用各类约束和指令,具体文件及用途如下表8所示:
表8:约束文件详情
| File Name | Usage |
|---|---|
| ace_constraints.sdc | Timing constraints used by ACE. More than one SDC file can be included in an ACE project. |
| ace_options.sdc | Control ACE settings, such as flow mode, speed grade, reporting of unconstrained paths. Fix locations of elements within the ACE fabric, and creation of placement regions. |
| synplify_constraints. fdc | Synplify FPGA design constraints. Set 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 | Control Synplify settings, such as top module. Create synthesis specific parameters, generics and defines. |
I/O环约束文件
除上述约束文件外,I/O环会生成专用于架构内核与包含接口子系统的I/O环之间接口的约束文件。这些文件可通过ACE从相应的.acxip文件自动生成,为简化构建流程,设计为需要配置I/O环接口子系统的工程提供了预先生成的文件,存放于/src/ioring目录,具体文件及用途如下表9所示:
表9:I/O环约束文件详情
| File Name | Usage |
|---|---|
| <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_util. xml | Used by ACE to generate a combined utilization report, combining the fabric and I/O ring resources. |
器件仿真模型(DSM)
多数设计需要一个名为器件仿真模型(DSM)的仿真叠加层,该包整合了片上网络的完整寄存器传输级代码,以及片上网络和FPGA架构周边所有接口子系统的总线功能模型。片上网络的真实寄存器传输级代码与硬件接口子系统的模型相结合,使开发者能在快速响应的仿真环境中开发设计,同时实现与片上网络的周期精确接口,以及从硬件接口子系统获得具有代表性的周期响应,该仿真环境支持开发者快速迭代、开发和调试设计。
模型描述
器件仿真模型为片上网络提供完整的寄存器传输级代码,为周边接口子系统提供总线功能模型,该结构被封装在按器件命名的SystemVerilog模块中(如ac7t1500),需在顶层测试平台中实例化一个该模块。
此外,器件仿真模型提供绑定宏,可实现设计中的元件与器件内部相同元件之间的绑定。例如,设计中实例化了一个片上网络访问点(NAP),则需使用ACX_BIND_NAP_SLAVE、ACX_BIND_NAP_MASTER、ACX_BIND_NAP_HORIZONTAL或ACX_BIND_NAP_VERTICAL宏(根据设计需求选择),将该NAP实例绑定至片上网络中正确位置的NAP。
同理,需将设计的端口与接口子系统的直接连接接口(DCI)进行绑定。器件中的每个直接连接接口均与一个SystemVerilog接口相连,可从顶层测试平台直接访问该接口,并在SystemVerilog接口与设计端口之间分配信号。
版本控制
器件仿真模型受版本控制,在一个版本中,可能会新增部分功能,同时弃用或替换旧功能。版本信息既体现在包名中(ACE_<major>.<minor>.<patch>_IO_BFM_sim_<update>.zip/tgz),也记录在包根目录的readme文件中。
为保证使用正确版本的I/O环仿真包,设计测试平台中必须包含一个验证版本兼容性的任务,该任务的实例化方式如下:
// For this example the DSM instance is ac7t1500
initial begin
// Ensure correct version of DSM is being used // This design requires 8.3.3 as a minimum
ac7t1500.require_version(8, 3, 3, 0);
end
require_version()任务
require_version任务包含四个参数,顺序如下:
-
主版本:与发布的主版本号匹配;
-
次版本:与发布的次版本号匹配;
-
补丁版本:与发布的补丁版本号匹配(可选);
-
更新版本:与发布的更新版本号匹配(可选)。
若未指定补丁版本或更新版本,需将其设置为0,例如8.3版本的参数设置为8,3,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)。
示例设计
下图3展示了实例化器件仿真模型和用户被测设计的用户测试平台示例结构,演示了两个GDDR6子系统实例所需的从片上网络访问点绑定宏和直接连接接口,其他类型的片上网络访问点或直接连接接口(如DDR)的绑定方式,可参考绑定宏章节和直连接口章节的表格。
图3:仿真结构示例
上述示例中包含my_nap1和my_nap2两个片上网络访问点,以及my_dc0_1和my_dc0_2两个直接连接接口。在顶层测试平台中,通过ACX_BIND_NAP_SLAVE宏将设计中的片上网络访问点与器件内部的片上网络访问点绑定,该宏支持通过指定片上网络访问点在片上网络中的坐标,使仿真与该访问点在硬件中的物理布局保持一致。
直接连接接口是用户设计的端口,需将这些端口分配至器件直接连接SystemVerilog接口中的相应信号。
以下为基于ac7t1500器件的实例化Verilog代码示例:
//--------
// 实例化Speedster7t1500
// 连接芯片就绪端口
// 注:ac7t1500的所有端口均已定义,可根据需要直接连接
ac7t1500 ac7t1500( .FCU_CONFIG_USER_MODE (chip_ready ) );
// 设置消息的详细程度选项
// 使用内置的set_verbosity()任务
initial begin
ac7t1500.set_verbosity(3);
end
//
// 绑定片上网络访问点
//-----
logic
// 将my_nap1绑定至位置(4,5)
`ACX_BIND_NAP_AXI_SLAVE(dut.my_nap1,4,5);
// 将my_nap2绑定至位置(2,2)
`ACX_BIND_NAP_AXI_SLAVE(dut.my_nap2,2,2);
/
// 连接直接连接接口
//---.
// 创建连接至直接连接接口的信号
my_dc0_1_clk;
logic
logic
logic
logic my_dc0_1_awvalid;
logic my_dc0_1_awaddr;
logic
logic my_dc0_1_awready;
my_dc0_2_clk;
logic
logic my_dc0_2_awvalid;
logic my_dc0_2_awaddr;
logic
logic my_dc0_2_awready;
// 将信号连接至ac7t1500器件中的gddr6_xx_dc0接口
assign ac7t1500.gddr6_xx_dc0.awvalid = my_dc0_1_awvalid; // 器件输入
assign ac7t1500.gddr6_xx_dc0.awaddr = my_dc0_1_awaddr;
// 器件输出
assign my_dc0_1_awready = ac7t1500.gddr6_xx_dc0.awready;
....
// 将信号连接至ac7t1500器件中的gddr6_yy_dc0接口
// 器件输入
assign ac7t1500.gddr6_yy_dc0.awvalid = my_dc0_2_awvalid;
assign ac7t1500.gddr6_yy_dc0.awaddr = my_dc0_2_awaddr;
// 器件输出
assign my_dc0_2_awready = ac7t1500.gddr6_yy_dc0.awready;
// 切记连接时钟!
assign my_dc0_1_clk = ac7t1500.gddr6_xx_dc0.clk;
assign my_dc0_2_clk = ac7t1500.gddr6_yy_dc0.clk;
注
使用绑定宏时,可指定目标片上网络访问点的列和行坐标。为保证仿真与硬件的一致性,需在ACE布局文件(如.pdc)中添加匹配的布局约束,示例如下:
-
仿真中:`ACX_BIND_NAP_AXI_SLAVE(dut.my_nap1,4,5);
-
布局布线中:set_placement -fixed {i:my_nap} {s:x_core.NOC[4][5].logic.noc.nap_s}
set_verbosity()任务
除指定所需仿真包版本和实例化器件外,还可通过set_verbosity任务控制器件仿真模型输出消息的详细程度,详细程度等级定义如下表10所示,上述代码示例展示了该函数的调用方式。
表10:详细程度等级
| Verbosity Level | Description |
|---|---|
| 0 | Print no messages |
| 1 | Print messages from master and slave 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实现)。
绑定宏
设计中提供的绑定语句如下表11所示:
表11:绑定宏
| Macro | Arguments | Description |
|---|---|---|
| ACX_BIND_NAP_HORIZONTAL | user_nap_instance, noc_colunm, noc_row | To bind a horizontal streaming NAP, instance ACX_NAP_HORIZONTAL. |
| ACX_BIND_NAP_VERTICAL | user_nap_instance, noc_colunm, noc_row | To bind a vertical streaming NAP, instance ACX_NAP_VERTICAL. |
| ACX_BIND_NAP_AXI_MASTER | user_nap_instance, noc_colunm, noc_row | To bind an AXI master NAP, instance ACX_NAP_AXI_MASTER. |
| ACX_BIND_NAP_AXI_SLAVE | user_nap_instance, noc_colunm, noc_row | To bind an AXI slave NAP, instance ACX_NAP_AXI_SLAVE. |
直连接口(DCI)
器件中,高速接口子系统(如GDDR、DDR、PCIe、以太网和串行解串器(SerDes))与架构之间的非片上网络访问点连接被称为直接连接接口(DCI),主要包括:
-
内存接口的附加数据端口(AXI);
-
PCIe的专用数据接口(CII)和串行解串器的原始模式接口;
-
以太网的状态和控制接口。
各子系统直接连接接口端口的详细信息,可参考相应接口子系统的用户指南。
将用户设计连接至直接连接接口端口有两种方法:通过器件仿真模型中内置的接口直接连接,或使用ACE生成的端口绑定文件,以下将详细介绍这两种方法。
推荐流程
- 通常,项目初期尚未开发ACE工程时,使用直接连接至器件仿真模型端口的方式;
- 项目后期可根据需要选择使用ACE绑定文件,两种方法的最终目标一致,均是将被测设计的I/O端口连接至器件仿真模型中的相应位置。
直接连接方式基于SystemVerilog接口实现,因此可在这些接口中添加协议检查、性能测量等附加功能;ACE端口绑定方式有助于验证被测设计向ACE提供的端口一致性(包括网表和ACE生成的IP文件),该流程可在布局布线前调试端口命名不匹配等问题。
DSM DC接口
器件仿真模型为每个直接连接接口端口提供一个SystemVerilog接口,可用接口如下表12所示:
表12:DSM DC接口
| Subsystem | Interface Name | Physical Location (1) | GDDR6 Channel | SystemVerilog Interface Type | Data Width | Address Width |
|---|---|---|---|---|---|---|
| GDDR6 | gddr6_1_dc0 | West 1 | 0 | t_ACX_AXI4 | 512 | 33 |
| GDDR6 | gddr6_1_dc1 | West 1 | 1 | t_ACX_AXI4 | 512 | 33 |
| GDDR6 | gddr6_2_dc0 | West 2 | 0 | t_ACX_AXI4 | 512 | 33 |
| GDDR6 | gddr6_2_dc1 | West 2 | 1 | t_ACX_AXI4 | 512 | 33 |
| GDDR6 | gddr6_5_dc0 | East 1 | 0 | t_ACX_AXI4 | 512 | 33 |
| GDDR6 | gddr6_5_dc1 | East 1 | 1 | t_ACX_AXI4 | 512 | 33 |
| GDDR6 | gddr6_6_dc0 | East 2 | 0 | t_ACX_AXI4 | 512 | 33 |
| GDDR6 | gddr6_6_dc1 | East 2 | 1 | t_ACX_AXI4 | 512 | 33 |
| DDR | 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 | - | - |
| PCIe | pciex8_dc_cii | North West | - | t_ACX_CII | - | - |
| PCIe | pciex16_dc_cii | North East | - | t_ACX_CII | - | - |
| PCIe | pciex16_dc_master | North East | - | t_ACX_AXI4 | 512 | 42 |
| PCIe | pciex16_dc_slave | North East | - | t_ACX_AXI4 | 512 | 40 |
| 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 | - | t_ACX_SERDES_DCI | 128 | - |
| Serdes | serdes_eth1_q1_dc | North East | - | t_ACX_SERDES_DCI | 128 | - |
注
- 文中东西方向的物理方位,均以在ACE中查看芯片布局图的视角为准。需注意,芯片封装时会绕垂直轴旋转,因此布局图中显示为西侧的接口,在PCB板上的物理位置实际为器件的东侧;南北方位不受旋转影响,与本表、ACE视图及板上器件的方位保持一致。
**注:**并非所有器件都支持全部接口,需参考对应器件的数据手册,确认所选器件包含的接口类型。
直接连接至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;
// If the DSM is instantiated with an instance name of ac7t1500, connect to GDDR_1, DC port 0.// awready is an output from the DSM, and an input to the DUT
assign dut_awready = ac7t1500.interfaces.gddr6_1_dc0.awready;
// awvalid is an input to the DSM, and an output from the DUT
assign ac7t1500.interfaces.gddr6_1_dc0.awready = dut_awvalid;
// Instantiate the DUT
my_design DUT (
......
.dut_awready (dut_awready),
.dut_awvalid (dut_awvalid),
......
);
通过端口绑定文件连接至器件仿真模型接口
使用端口绑定文件连接时,需在测试平台中完成以下配置:
-
创建ACE工程(此阶段无需网表),配置所有接口子系统IP;
-
生成子系统IP文件,包括名为<design_name>_user_design_port_bindings.svh的文件;
-
在测试平台中声明信号,信号名必须与被测设计的端口名一致,因端口绑定文件将使用该名称进行匹配;
-
在测试平台中包含端口绑定文件。将器件仿真模型的所有直接连接接口设置为仅监控模式。这一点至关重要,若不进行该设置,器件仿真模型和被测设计会通过绑定文件同时驱动从架构到子系统的端口,导致信号解析冲突,仿真失败。启用
ACX_DSM_INTERFACES_TO_MONITOR_MODE宏定义,即可将器件仿真模型的直接连接接口设为仅监控模式。
注
在Achronix参考设计流程中,生成的子系统IP文件会保存至/src/ioring目录,而非默认的/src/ace/ioring_design目录。
ACX_DSM_INTERFACES_TO_MONITOR_MODE宏定义必须添加至仿真命令行中,确保编译器件仿真模型时该宏已生效;不可在用户测试平台中添加,因用户测试平台的编译晚于器件仿真模型。在本参考设计提供的流程中,该宏定义需在/sim/<simulator>/system_files_bfm.f和/sim/<simulator>/system_files_rtl.f文件中进行定义。
以下为通过端口绑定文件连接被测设计所有端口的示例:
system_files_bfm.f
# ---------------------------------------------------------------------
# Description : ac7t1500 full-chip BFM simulation filelist
# ---------------------------------------------------------------------
# Set whether the DSM DCI interfaces are set to monitor mode only
+define+ACX_DSM_INTERFACES_TO_MONITOR_MODE
# ACE libraries must be defined first as they are referenced
# by the fullchip files that follow
+incdir+$ACE_INSTALL_DIR/libraries/
$ACE_INSTALL_DIR/libraries/device_models/7t_simmodels.v
# Fullchip include filelist
# This must be placed before the user filelist as it defines
# the binding macros and utilities used by the user testbench.
$ACX_DEVICE_INSTALL_DIR/sim/ac7t1500_include_bfm.v <---- DSM compiled here before user design or testbench
/*****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),
......
);
器件仿真模型接口的双模式连接
由于端口绑定方式需要启用特定宏定义,因此可在测试平台中通过该宏定义实现两种连接方式的切换。只需启用或禁用该宏,即可支持两种连接流程,以下为支持双模式连接的测试平台示例:
// 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 = ac7t1500.interfaces.gddr6_1_dc0.awready;
assign ac7t1500.interfaces.gddr6_1_dc0.awready = dut_awvalid;
`endif
// Instantiate the DUT
my_design DUT (
......
.dut_awready (dut_awready),
.dut_awvalid (dut_awvalid),
......
);
时钟频率配置
除接口绑定外,还可控制这些接口生成的时钟频率。为保证设计完整性,仿真中设置的时钟频率需与设计预期的工作频率一致。设计实现时,时钟频率在ACE IO Designer工具中配置;仿真时,可通过set_clock_period函数进行配置。
以下示例为将GDDR6East1控制器的工作频率设置为1GHz(适用于16 Gbps工作速率),由于直接连接接口的工作频率为控制器频率的一半,因此将其配置为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
ac7t1500.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)ac7t1500.clocks.set_clock_period("gddr6_5_dc0_clk", GDDR6_CONTROLLER_CLOCK_PERIOD*2);
注
set_clock_period函数位于ac7t1500模型中,该模型的默认时间尺度为1皮秒,因此无论调用模块的时间尺度如何,指定的时钟周期均以皮秒为单位。
可配置的时钟频率接口如下表13所示:
表13:时钟频率接口
| Subsystem | Interface Name | Physical Location[^1] | GDDR6 Channel |
|---|---|---|---|
| GDDR6 | gddr6_0_noc0_clk | West 0 NoC | 0 |
| GDDR6 | gddr6_0_noc1_clk | West 0 NoC | 1 |
| GDDR6 | gddr6_1_noc0_clk | West 1 NoC | 0 |
| GDDR6 | gddr6_1_noc1_clk | West 1 NoC | 1 |
| GDDR6 | gddr6_2_noc0_clk | West 2 NoC | 0 |
| GDDR6 | gddr6_2_noc1_clk | 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 |
| DDR | ddr4_noc0_clk | South NoC | – |
| DDR | ddr4_dc0_clk | South DCI | – |
| PCIe | pciex16_clk | Gen5 PCIe ×16 | – |
| PCIe | pciex16_dc_clk | Gen5 PCIe ×16 DCI | – |
| PCIe | pciex8_clk | Gen5 PCIe ×8 | – |
| Ethernet | ethernet_ref_clk | Ethernet reference clock[^2] | - |
| Ethernet | ethernet_ff0_clk | Ethernet FIFO 0 clock [^2] | - |
| Ethernet | ethernet_ff1_clk | Ethernet FIFO 1 clock [^2] | - |
| Configuration | cfg_clk | System wide configuration clock | – |
注
-
文中东西方向的物理方位,均以在ACE中查看芯片布局图的视角为准。需注意,芯片封装时会绕垂直轴旋转,因此布局图中显示为西侧的接口,在PCB板上的物理位置实际为器件的东侧;南北方位不受旋转影响,与本表、ACE视图及板上器件的方位保持一致。
-
以太网时钟为两个以太网子系统共用,仿真中必须将其设置为相同的工作频率。
配置
多个接口子系统需要在上电时进行配置。在实际硬件中,该配置由比特流对相关配置寄存器进行预编程实现;在仿真环境中,可通过相关任务读取配置文件,并将配置应用至对应的接口子系统。以下代码片段为配置应用的示例:
// -------------------------
// 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
ac7t1500.fcu.configure( "ethernet_cfg.txt", "ethernet0" );
ac7t1500.fcu.configure( "ethernet_cfg.txt", "ethernet1" );
join
end
启动流程
fcu.configure()任务处理配置过程中(包括等待轮询返回有效值的阶段),芯片状态输出章节信号不会被置位。该行为与实际硬件一致:器件仅在配置完成后,才会进入用户模式。
仿真测试平台可按上述方式执行配置流程,当芯片状态输出章节信号置位时,测试平台即可确认器件已完成正确配置,随后便可施加相应的测试激励。
fcu.configure()任务
该任务的参数定义如下:
fcu.configure ( <configuration filename>, <interface subsystem name> );
支持的接口子系统名称如下表14所示:
表14:配置子系统名称
| Subsystem | Interface Subsystem Name[^1] | Physical Location [^3] |
|---|---|---|
| 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 |
| DDR | ddr4 | South |
| Ethernet | ethernet0 | North |
| Ethernet | ethernet1 | North |
| GPIO North | gpio_n | North |
| GPIO South | gpio_s | South |
| PCle x8 | pcie_0 | North |
| PCle x16 | pcie_1 | North |
| All subsystems | full[^2] |
表注
-
接口子系统名称不区分大小写;
-
使用
full子系统名称时,配置文件中需使用42位完整地址;选择单个子系统时,仅需28位地址,具体格式见配置文件格式章节; -
文中东西方向的物理方位,均以在ACE中查看芯片布局图的视角为准。需注意,芯片封装时会绕垂直轴旋转,因此布局图中显示为西侧的接口,在PCB板上的物理位置实际为器件的东侧;南北方位不受旋转影响,与本表、ACE视图及板上器件的方位保持一致。
配置文件格式
配置文件的格式定义如下:
# ------------------------------------------
# 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,该地址与片上网络全局内存映射及控制状态寄存器(CSR)内存区域保持一致。通过该模式,单个配置文件可对多个接口子系统进行寻址,更多细节见《Speedster7t片上网络用户指南》(UG089)。
并行配置
fcu.configure()任务被定义为SystemVerilog自动任务,支持可重入并并行运行。因此,可通过fork - join结构对多个接口子系统进行并行编程,参考设计的测试平台中包含该并行编程的示例。
SystemVerilog接口
设计中定义了以下SystemVerilog接口,用于直接连接接口的分配:
注
以下接口仅在仿真环境中可用;对于需要综合的代码,需自定义SystemVerilog接口,或使用参考设计中预定义的接口之一。
interface t_ACX_AXI4
#(DATA_WIDTH = 0,
ADDR_WIDTH = 0,
LEN_WIDTH = 0);
logic clk; // 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 master (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 slave (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);
endinterface : t_ACX_AXI4
器件仿真模型安装
软件包类型
基于授权协议要求,器件仿真模型提供两种不同的软件包:
- **Base:**包含器件内核的完整周期精确仿真模型(包括片上网络、网络访问点、以太网和GPIO子系统);同时包含GDDR、PCIe和DDR4接口子系统的总线功能模型仿真模型。这些总线功能模型支持对应子系统的典型时序,且能显著提升仿真速度。从这些接口子系统到片上网络的所有数据传输,均使用周期精确的片上网络模型,进一步提升了时序精度。
-**RTL:**在基础包的基础上,增加了PCIe、GDDR和DDR4内核的完整周期精确模型。使用该模型可实现整个系统的全周期精确仿真,但会大幅增加仿真时间。该软件包受授权控制,如需获取,需向support@achronix.com发送支持请求,满足授权条件后,将收到带水印的专属软件包下载链接。
命名规则
每种器件均提供对应的器件仿真模型包,支持Linux和Windows系统。Base在Linux系统命名为ACE_<DSM version>_<device>_DSM_base_Sim_overlay.tgz,Windows系统命名为ACE_<DSM version>_<device>_base_Sim_overlay.zip;
ACE_8.3.3_ac7t1500_DSM_base_sim_overlay.tgz:适用于ac7t1500器件的Linux版基础器件仿真模型叠加包,器件仿真模型版本为8.3.3(非ACE版本)。
RTL 命名为ACE_<DSM version>_<device>_DSM_RTL_Sim_overlay.tgz(Linux/Windows通用)。
注
器件仿真模型包中的版本号为器件仿真模型自身的版本,而非ACE版本,并非每个ACE版本都会对应发布新的器件仿真模型版本。因此,旧版本的器件仿真模型可与新版本的ACE配合使用,例如器件仿真模型8.2.1可与ACE 8.3.2搭配使用。
下载方式
- 基础包:可从Achronix自助FTP站点secure.achronix.com的
/Achronix/ACE/Speedster7t文件夹下载,各器件的软件包相互独立,用户可仅下载目标器件的包,或下载所有器件包;
RTL基于授权协议要求,需通过上述方式向Achronix技术支持发送请求获取。
所有软件包仅需安装一次,可用于所有面向该器件的设计。
与ACE的集成
升级现有安装
若ACE中已安装旧版本的器件仿真模型包,建议先删除现有包再进行升级,以保证新安装的完整性。删除步骤:导航至<ACE_INSTALL_DIR>/system/data/yuma-alpha-rev0/sim并删除该目录,随后返回ACE安装根目录,按照下文的步骤操作。
首次安装
推荐的安装方式为将软件包内容合并至当前ACE安装目录。软件包包含根目录/system,需将该文件夹的内容与所选ACE安装目录的/system文件夹合并。
警告
仿真包中的文件均为ACE基础安装中未包含的文件,安装时无需替换或覆盖现有文件;但如果已下载过旧版本的仿真包,安装时需选择“覆盖”,确保将最新的仿真文件写入ACE安装目录。
独立安装
在某些情况下,若无法修改现有ACE安装目录,可将软件包单独安装,仿真时同时调用该仿真包和ACE中现有的仿真文件。
独立安装的操作方式:直接将软件包解压至指定位置即可。
注
所有参考设计均配置为将仿真包集成在ACE中使用;若选择独立安装方式,需修改参考设计Makefile中的相关环境变量。
环境变量
ACE和仿真包的路径由两个环境变量控制,运行所有参考设计的仿真前,必须先设置这两个变量:
ACE_INSTALL_DIR
该变量需指向ace或ace.exe可执行文件的安装目录,综合和仿真过程均通过该变量定位正确的器件库文件。
ACX_DEVICE_INSTALL_DIR(可选)
该变量用于指定器件仿真模型文件的路径,需指向器件仿真模型包中器件文件的基础目录,例如若选择ac7t1500器件,该目录为yuma-alpha-rev0。
-
与ACE集成安装时,设置为:
ACX_DEVICE_INSTALL_DIR = $ACE_INSTALL_DIR/system/data/yuma-alpha-rev0; -
独立安装时,设置为:
ACX_DEVICE_INSTALL_DIR = <独立安装包路径>/system/data/yuma-alpha-rev0。
注
仅当器件仿真模型为独立安装时,仿真才需要设置ACX_DEVICE_INSTALL_DIR变量。所有提供的设计中,仿真Makefile均按与ACE集成安装的方式定义了该变量,该定义优先级高于本地环境变量。若使用提供的仿真Makefile,可通过以下方式在编译流程中覆盖该变量的定义:
make ACX_DEVICE_INSTALL_DIR=/system/data/yuma-alpha-rev0
参考设计的仿真
支持的仿真器
本设计提供统一的仿真环境,包含适用于明导QuestaSim和新思科技VCS仿真器的脚本。
目录位置
所有设计的根目录下均包含/sim目录,该目录下有分别对应两款仿真器的/vcs和/questa子目录。
仿真流程
设计支持多种仿真流程选项,可在仿真速度和精度之间做平衡,并非所有参考设计都支持全部流程选项,具体可配置的流程选项见对应的Makefile。
独立仿真流程
设计中的所有网络访问点均使用绑定至自身的独立模型,模拟内存行为。该模式的仿真速度最快,但周期精确性最低;网络访问点仅与自身的内存模型交互,因此不支持多个网络访问点访问同一公共内存的设计。在本参考设计中,将仿真Makefile中的FLOW变量设置为STANDALONE,即可启用该模式。
全芯片总线功能模型流程(Full-Chip BFM)
使用全芯片模型,片上网络为周期精确,片上网络周边的所有硬件接口均为总线功能模型。这些总线功能模型带有典型延迟,因此该模式可实现接近周期精确的仿真;同时无需接口子系统执行初始化和校准步骤,相比全周期精确仿真,迭代时间更短。
运行该流程需先下载并安装I/O环仿真包,在本参考设计中,将仿真Makefile中的FLOW变量设置为FULLCHIP_BFM,即可启用该模式。
全芯片寄存器传输级流程(Full-Chip RTL)
该模式整合了子系统的完整寄存器传输级代码,必要时还会搭配外部组件(如内存)的周期精确模型,可实现完全周期精确的仿真,还原硬件的实际工作状态。多数该模式的仿真,需要通过提供的配置文件对相应子系统进行配置。
由于该模式使用子系统的完整寄存器传输级代码,仿真速度比总线功能模型模式慢,但能提供完整的时序精度。
注
获取GDDR/DDR或PCIe子系统的加密寄存器传输级代码,需要额外的授权仿真包,需联系Achronix技术支持办理授权并获取该包。
在本参考设计中,将仿真Makefile中的FLOW变量设置为FULLCHIP_RTL,即可启用该模式。
构建选项
每个仿真器目录下均包含一个Makefile,用户可通过编辑该文件配置仿真需求,需设置的核心变量如下:
-
FLOW:匹配所选的仿真流程,可选值为
STANDALONE、FULLCHIP_BFM或FULLCHIP_RTL(具体见Makefile说明); -
TOP_LEVEL_MODULE:为参考设计预设,若用户将设计移植至自定义测试平台,需更新该变量;
-
ACX_DEVICE_INSTALL_DIR:指向ACE安装目录下的器件文件目录(例如
$ACE_INSTALL_DIR/system/data/yuma-alpha-rev0),更多信息参考I/O环仿真包的安装说明。
前置条件
运行所有安装操作前,用户需确保完成以下配置:
-
已设置
ACE_INSTALL_DIR环境变量,指向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:仅适用于全芯片总线功能模型流程,为该流程提供系统文件列表,也可在其中添加自定义宏定义;
-
system_files_rtl.f:仅适用于全芯片寄存器传输级流程,为该流程提供系统文件列表,同时包含将子系统从总线功能模型切换为周期精确寄存器传输级的宏定义(宏定义命名规则为
<subsystem name>_FULL,例如GDDR6_2_FULL),也可在其中添加自定义宏定义。
VCS Only
-
fullchip_bfm_vcs_waiver.cfg:仅适用于全芯片总线功能模型流程,为豁免文件,用于屏蔽无影响的警告;
-
session.sim_output_pluson.vpd.tcl:为DVE波形查看器的会话文件。
QuestaSim Only
-
wave.do:波形配置文件;
-
qsim_<design_name>.do:非Makefile的图形界面仿真流程,跨系统兼容。
RTL仿真宏定义
编译并运行全芯片寄存器传输级流程时,需为仿真编译启用相应的SystemVerilog宏定义。当仿真Makefile中的FLOW变量设置为FULLCHIP_RTL时,Makefile会在编译命令行中包含system_files_rtl.f文件。
将仿真模块从总线功能模型切换为完整寄存器传输级的所有必要宏定义,均在system_files_rtl.f文件中启用。例如,若使用GDDR6参考设计,且需要将GDDR6内存控制器1设置为完整寄存器传输级仿真,其余控制器保持总线功能模型,需按以下方式编辑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
<-------- User does not need to change any options below here ---->
# ACE libraries must be defined first as they are referenced
# by the fullchip files that follow
+incdir+$ACE_INSTALL_DIR/libraries/
$ACE_INSTALL_DIR/libraries/device_models/7t_simmodels.v
# Fullchip include filelist
# This must be placed before the user filelist as it defines
# the binding macros and utilities used by the user testbench.
$ACX_DEVICE_INSTALL_DIR/sim/ac7t1500_include_bfm.v
将各模块切换为完整寄存器传输级(替代总线功能模型)的宏定义如下表15所示:
表15:仿真寄存器传输级宏定义
| Module | Define |
|---|---|
| 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 |
| 表注 |
上表中各接口子系统的位置和名称,可在ACE的IP配置视图中,通过选择I/O布局图查看。
警告
为模块启用完整寄存器传输级仿真会增加仿真时间;若同时启用多个模块,仿真时间可能会大幅延长。
运行仿真
所有仿真器流程的仿真目录下均包含Makefile,该Makefile支持以下构建选项:
VCS
code
$ 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
code
$ 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非Makefile流程
为支持不原生支持Makefile的环境(如Windows),额外提供了基于QuestaSim .do 文件的非Makefile仿真流程,操作步骤如下:
-
导航至
sim/questa目录; -
启动QuestaSim图形界面,常规命令为:
$ vsim;
在QuestaSim图形界面中运行脚本:$ do qsim_<design_name>.do。
注
QuestaSim脚本会使用ACE_INSTALL_DIR环境变量,为保证该脚本(或其他脚本)流程正常运行,ACE需安装在路径名无空格的目录中(例如C:\achronix\8.2.1\Achronix_CAD_Environment);此外,环境变量ACE_INSTALL_DIR需使用“/”作为路径分隔符,而非“\”,示例如下:
ACE_INSTALL_DIR = C:/achronix/8.2.1/Achronix_CAD_Environment/Achronix
注
该脚本默认配置为FULLCHIP_BFM流程,可通过修改脚本中注释的选项,将其切换为STANDALONE流程。
结果验证
所有设计均使用自校验测试平台,将寄存器传输级代码生成的结果与验证输出进行对比。验证输出的来源包括数学包、软件模型或寄存器传输级行为模型,各设计对应的具体验证来源见其详细说明。
参考设计的构建
本设计使用统一的构建环境,通过Makefile和脚本以批处理模式运行Synplify Pro和ACE。
前置条件
运行所有安装操作前,用户需确保完成以下配置:
-
已设置
ACE_INSTALL_DIR环境变量,指向ACE可执行文件的安装目录; -
ACE已添加至系统环境路径,最简单的方式为将
$ACE_INSTALL_DIR添加至路径变量; -
Synplify Pro已添加至系统环境路径。
批处理流程
设计根目录下包含/build目录,该目录下有一个Makefile。运行该Makefile前,需确保已满足上述前置条件;Makefile中的相对路径基于/build目录设计,若将Makefile移动至新目录或在该目录外调用,需相应调整路径。
运行Makefile(使用默认选项)将完成以下操作:
-
创建
/build/results/syn目录:以批处理模式运行Synplify Pro,对设计进行综合,在/results/syn/rev_1/<design_name>.vm生成网表。若综合失败,需查看/results/syn/rev_1/<design_name>.srr文件,了解综合失败的详细原因。生成的Synplify Pro工程文件的选项,由/src/constraints/synplify_options.tcl文件控制。 -
创建
/build/results/ace目录:综合完成后,以评估模式运行ACE(评估模式下无需指定I/O引脚)。ACE生成工程的所有可选配置,由/src/constraints/ace_impl_options.tcl文件控制。
Makefile选项
该Makefile支持多种构建流程选项,具体如下:
code
$ make : Default flow. Synthesize and build a single implementation with ACE
$ make run : Same as "make"
$ make syn_only : Synthesis only
$ 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 clean : Delete all generated and temporary files
约束文件
除上述约束文件外,所有构建流程还可能使用其他约束文件,所有约束文件均位于/src/constraints目录:
-
ace_timing.sdc、<design_name>.sdc:综合和ACE均会使用的时序约束文件; -
<design_name>.fdc:Synplify Pro使用的FPGA约束文件,用于设置编译点等非时序相关的指令和属性; -
<design_name>.pdc:ACE使用的布局约束文件。
各流程使用的文件列表,以及各工具对应的文件,可参考相应的/src/filelist_xx.tcl文件。
GUI流程
设计为ACE和Synplify Pro均提供了预生成的图形界面工程文件,分别位于/src/ace和/src/syn目录,用户可打开这些文件,以交互方式编辑或运行构建。
注
使用图形界面工程时,所有生成的文件将保存在图形界面工程文件所在目录下:
-
Synplify Pro:修订目录(如rev_1)将生成在
/src/syn/rev_1; -
ACE:实现目录将生成为
/src/ace/impl_<name>;若使用ACE IO Designer生成新的约束文件,文件将默认保存至/src/ace/ioring_design目录。
使用批处理流程构建时,生成的工程文件将保存在/build/results目录下,用户可打开该目录下的ACE和Synplify Pro工程文件,以图形界面方式重新运行或编辑构建。
所发布的内容经achronix官方允许
参考设计完整工程在个人下载中心,可根据个人需求前往下载,如有问题可私信博主
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)