测试序列
测试序列包含传输层的long_test_pattern_test、short_test_pattern_test和链路层序列。
long_test_pattern_test
长测试序列在传输层产生,需要的传输层参数包括M、S、CF。
首先需要在cfg类中配置模式,同时配置控制位全0或全1。长序列模式下trans中的sample[]和ctrl_bits[]是无意义的。
tx_agent_cfg.command = svt_jesd204_types::LONG_TEST_PATTERN;
tx_agent_cfg.tail_bits_pattern = svt_jesd204_types::ALL_ONE/ALL_ZERO;
然后在trans中配置为长序列模式,test_duration指示序列重复次数,以LMFC周期为单位。
xact.cmd_type = svt_jesd204_transaction::LONG_TEST_PATTERN_COMMAND;
xact.test_duration = 5;
从波形可以看到序列重复发送5次。

默认发送的是满足协议要求的零数据,以M=2、S=1、N=16、N'=20、F=5、K=4为示例。这几个数看着可能不太理解,可以参照后面的规则表。
// FRAME 0 <00> <01> <80> <00> <20>
// FRAME 1 <00> <01> <00> <00> <18>
// FRAME 2 <80> <00> <08> <00> <00>
// FRAME 3 <80> <00> <08> <00> <7c>
也可以调用agent中的方法,通过文件指定长测试序列,下面为文件格式示例。
cvtr_agent.drive_user_defined_pattern_using_file("tl_long_test_pattern.txt");
/*tl_long_test_pattern.txt*/
/*converter0 */ 0001_8
/*converter1 */ 0002_0
/*converter0 */ 0001_0
/*converter1 */ 0001_8
/*converter0 */ 8000_0
/*converter1 */ 8000_0
/*converter0 */ 8000_0
/*converter1 */ 800f_0
最后附上协议中对长测试序列的要求,序列不能是完全自定义。

short_test_pattern_test
短测试序列也产生于传输层,按照帧(frame)循环发送。也需要配置M、S、N'、F,只不过不用配K了。
首先需要在cfg类中配置模式。可以此时配置序列内容short_test_sample,假如不配那数据就使用trans中的sample[]、ctrl_bits[]和tail_bits[]。short_test_sample的有效数据宽度为N',数组深度为M*S。
tx_agent_cfg.command = svt_jesd204_types::SHORT_TEST_PATTERN;
tx_agent_cfg.short_test_sample = '{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
然后在trans中指定包类型和重复次数。
xact.cmd_type = svt_jesd204_transaction::SHORT_TEST_PATTERN_COMMAND;
xact.test_duration = 5;
以M=10,S=1为例,可以看到重复发送0~9。也可以用drive_user_defined_pattern_using_file方法发送指定文件中的数据,这个方法优先级高于short_test_sample和sample。发送指定文件中数据的方法也可以用于普通的数据传输。

链路层测试序列
链路层支持序列如下,可以通过后面会介绍的ll_testmode_type选择序列。
typedef enum bit[2:0] {
D21_5 = `SVT_JESD204_D21_5_TEST_SEQ ,
K28_5 = `SVT_JESD204_K28_5_TEST_SEQ ,
ILA_TEST_SEQ = `SVT_JESD204_ILA_TEST_SEQ ,
USER_DEFINE = `SVT_JESD204_USER_DEFINE_TEST_SEQ,
JSPAT = `SVT_JESD204_JSPAT_TEST_SEQ,
JTSPAT = `SVT_JESD204_JTSPAT_TEST_SEQ
} link_layer_test_sequence_enum;
在cfg类中,配置为链路测试模式,同时配置序列重复次数。因为链路测试就是重复发字符序列,没有K28.5同步(CGS)和初始化(ILA)过程,所以配置skip为1。
tx_agent_cfg.command=svt_jesd204_types::LINK_LAYER_TEST;
tx_agent_cfg.k_frame_in_testmode = 2;
tx_agent_cfg.skip_cgs_ila_in_jtspat=1;
在trans中,指定序列类型。
xact.cmd_type == svt_jesd204_transaction::LINK_LAYER_TEST_COMMAND;
xact.ll_testmode_type == svt_jesd204_types::JTSPAT;
JTSPAT序列长度118,重复2此,可以看到发送了236个采样周期的数据。

SYSREF相关
sysref生效
硬件环境方面,Subclass1首先需要额外连接sysref信号。
配置方面,需要配置svt_jesd204_configuration::device_enable_with_reset_sysref来决定第1次sysref的触发行为。
• 配置为0时,设备不会处理sysref信号。
• 配置为1时,收到sysref后TX RX同时生成时钟,以保证相位对齐,然后TX开始发送lane同步序列,RX开始回应SYNC...最后进行传输,过程如下图所示。

• 配置为2时,sysref不影响时钟,只会触发TX开始发送同步序列。

其实这个配置对Subclass0、Subclass2也有效,只不过Subclass0、2用reset信号代替sysref。
sysref请求
204B协议要求TX和RX可以发起重新初始化的请求,但没有说具体实现方式,VIP的处理是设备通过generate_sysref生成脉冲,然后外部受到触发后生成sysref信号(如果是Subclass0、2可以改成reset信号),然后TX RX重新同步再数据传输。
硬件环境方面,需要等待generate_sysref信号,然后手动拉低(VIP只负责拉高不负责拉低,很粗糙,但示例top.sv就是这么写的),再依据触发生成sysref信号。
配置方面,需要将svt_jesd204_configuration::reinitialize_with_sysref配为1。
请求传输,仅需要将成员变量req_sysref配为1即可,不需要配传输模式。
`uvm_create_on(xact,p_sequencer.rx_seqr[0]);
xact.req_sysref = 1;
`uvm_send(xact);
传输示例为:发送数据传输,延时等待,再发送sysref请求传输,然后循环。下面为传输波形,可以看到:
• a处,发送sysref请求传输后,RX的generate_sysref拉高,指示sys_ref请求,这个过程也可以由TX发起。此外需要注意的是如果是RX发起,则会现将SYNC拉低,再发起sys_ref请求(SYNC为高时sysref有效会报错)。
• b处,经过一定延时,tb中生成sysreg时钟,RX会在采到的第1次LMFC周期将SYNC拉高,然后TX开始发送ILA序列,然后继续传输
