一、 对EXAMPLE_DESIGN进行例化
前续文章分析过,对example_design提供正确的时钟和复位,其就具备了开始工作的条件,例化接口比较简单,在top.v中,顶层端口列表增加GT接口:
module top(
......
// GTX Serial I/O
input wire [0:0] gt_rxp,
input wire [0:0] gt_rxn,
output wire [0:0] gt_txp,
output wire [0:0] gt_txn,
......
);
并对example design进行例化如下:
aurora_64b66b_x1_exdes u_aurora_64b66b_x1_exdes
(
.RESET ( sys_rst ),
// Error Detection Interface
.HARD_ERR ( HARD_ERR ),
.SOFT_ERR ( SOFT_ERR ),
.DATA_ERR_COUNT ( DATA_ERR_COUNT ),
// Status
.LANE_UP ( LANE_UP ),
.CHANNEL_UP ( CHANNEL_UP ),
// System Interface
.INIT_CLK ( sys_clk_50m),
.PMA_INIT ( sys_rst ),
.DRP_CLK_IN ( sys_clk_50m ),
// GTX Reference Clock Interface
.GTHQ3_P ( si5324_in_p ),
.GTHQ3_N ( si5324_in_n ),
.RXP ( gt_rxp[0] ),
.RXN ( gt_rxn[0] ),
.TXP ( gt_txp[0] ),
.TXN ( gt_txn[0] )
);
例化说明:
1)IP EXAMPLE为用户接口提供了2个复位:RESET和PMA_INIT,其中,RESET用于复位逻辑部分,PMA_INIT用于复位GT;二者对于核来说,都是异步复位。 由sys_rst对二者进行控制。需要注意的是,参考时钟si5324_in_p/n需要等待IIC模块对SI5324芯片初始化完毕后才能产生,因此sys_rst的释放需要等待IIC模块工作结束后,再等待一段时间例如100ms后才释放,以免GTH在退出复位时其参考时钟未就绪,导致无法正常工作。Aurora IP建议当INIT_CLK和GT_REFCLK稳定后,一般先释放PMA_INIT,再释放RESET;但实测二者同时释放也没问题。
2)INIT_CLK和DRP_CLK为同一个50MHz的系统时钟,来源于FPGA片上DCM模块。
增加的约束为:
set_property PACKAGE_PIN AN6 [get_ports {gt_rxp[0]}]
二、建立Testbench文件
新建top_tb.v,内容如下:
`timescale 1ns/1ps
module top_tb
();
reg si5324_in;
wire si5324_in_p;
wire si5324_in_n;
wire [0:0] gt_txp;
wire [0:0] gt_txn;
top dut(
//--system clock in
.si5324_in_p ( si5324_in_p ),
.si5324_in_n ( si5324_in_n ),
........
// GTX Serial I/O
.gt_rxp ( gt_txp ),
.gt_rxn ( gt_txn ),
.gt_txp ( gt_txp ),
.gt_txn ( gt_txn )
);
initial
begin
si5324_in = 1;
forever #2.5 si5324_in = ~ si5324_in;
end
assign si5324_in_p = si5324_in;
assign si5324_in_n = ~si5324_in;
endmodule
注意到,提供200MHz参考时钟后,将gt_tx和gt_rx互联,仿真外部回环。
三、运行仿真并查看结果
将top_tb设置为仿真顶层文件,点击【Run simulation】,即可启动仿真。
仿真启动后,可以对感兴趣的模块的运行情况进行观察,如将frame_check和frame_gen的波形增加到窗口:
add wave sim:/top_tb/dut/u_aurora_64b66b_x1_exdes/core_traffic/frame_check_i/*
add wave sim:/top_tb/dut/u_aurora_64b66b_x1_exdes/core_traffic/frame_gen_i/*
运行:run 40us
在37.6us左右,CHANNEL_UP拉高,frame_gen退出复位状态,开始工作,产生数据;
在38.4us左右,frame_check接收到第一包数据,开始进行校验;
注意:1)仿真时GT_REFCLK为仿真产生的自由时钟,不存在SI5342的配置问题,因此需要认为IIC已经配置完毕,手动将RESET和PMA_INIT拉低,使example_design退出复位;
2)无法建立CHANNEL_UP,需要检查复位、GT_REFCLK时钟频率与IP设置是否一致、gt_txp/n与gt_rxp/n的连接关系;
继续RUN 300us后,frame_check中的DATA_ERR_COUNT信号一直为0,说明模块运行无误。