Synopsys AXI VIP 解析(3)—— reorder和delay

5 reorder

VIP的reorder对应AXI的out of order机制,包括B和R通道乱序返回。

配置

具体行为在svt_axi_port_configuration和svt_axi_transcation类中配置,相关变量如下。

svt_axi_port_configuration

typedef enum {
	ROUND_ROBIN = `SVT_AXI_REORDERING_ROUND_ROBIN,
    RANDOM      = `SVT_AXI_REORDERING_RANDOM, 
    PRIORITIZED = `SVT_AXI_REORDERING_PRIORITIZED 
} reordering_algorithm_enum;

//slave active only
rand int read_data_reordering_depth = 1;
rand int write_resp_reordering_depth = 1;
rand reordering_window_enum reordering_window = MOVING;
rand reordering_algorithm_enum reordering_algorithm = ROUND_ROBIN;
rand bit reordering_priority_high_value = 0;

svt_axi_transcation

//slave active only
rand int reordering_priority = 1;

返回模式

返回模式仅对slave有效(不知道为什么example里master也配了模式,应该无意义),模式分为ROUND_ROBIN、RANDOM、PRIORITIZED,对于单设备ROUND_ROBIN即为顺序,RANDOM是随机顺序返回,PRIORITIZED为优先级顺序返回。

示例:配置RANDOM返回模式,最大outstanding配置为8,可以看到返回37645201,顺序随机
在这里插入图片描述
在这里插入图片描述

prioritized

PRIORITIZED模式按优先级应答,优先级和AXI协议无关完全为VIP自定义,通过slave中给driver的transcation中reordering_priority值决定优先级,reordering_priority要求为>0的数值。reordering_priority_high_value为1时数值越大越优先,为0时越小越优先。reordering_priority、reordering_priority_high_value仅在PRIORITIZED模式有效。

示例:配置PRIORITIZED返回,outstanding深度为8,reordering_priority=8-id,越小越优先模式,可以看到id按7、6、5、4、3、2、1、0逆序返回
在这里插入图片描述

reorder深度

通过read/write_data_reordering_depth配置最大reorder深度,默认最大可配置为8,可以通过`SVT_AXI_MAX_READ_DATA_REORDERING_DEPTH和`SVT_AXI_MAX_WRITE_RESP_REORDERING_DEPTH修改

示例:将最大深度改为4,可以看到从7、6、5、4、3、2、1、0改为3、4、5、6、7、2、1、0。应答流程为:收到id3的wlast,缓存达到上限,输出0、1、2、3中优先级最大的3;再收到id4的wlast输出应答id4;…;输出完id7应答后总线空闲,返回缓存剩余的2、1、0
在这里插入图片描述

6 delay

基本延时

AXI各通道的valid、ready握手信号可以通过svt_axi_transaction分别配置延时,相关变量如下。

svt_axi_transcation

//slave active only
rand int addr_ready_delay = 0;
rand int rvalid_delay[];
rand int wready_delay[];
rand int bvalid_delay = 0;

//master active only
rand int addr_valid_delay = 0;
rand int wvalid_delay[];
rand int rready_delay[];
rand int bready_delay = 0;

示例:将wvalid_delay设置为0~15,bready_delay设置为16,可以看到W通道第1次握手后等待0cycle,第2次握手后等待1cycle …,延时策略是握手后等待_delay个时钟cycle,实际上策略配置是枚举变量并不固定
在这里插入图片描述

对于slave,将rready_delay设置为0~15,可以看到效果相同
在这里插入图片描述

随机延时

随机延时包含三档,相关变量如下。可以配置三挡的权重,三挡分别为:延时为0、延时为1~最大值/2、延时为最大值/2+1~最大值。最大值默认为16,通过宏定义可以修改最大值,例如addr_valid_delay最大值为`SVT_AXI_MAX_ADDR_VALID_DELAY。权重需要先修改再randomize。

svt_axi_transcation

int ZERO_DELAY_wt = 100;
int SHORT_DELAY_wt = 500;
int LONG_DELAY_wt = 1;

比较相似的还有ZERO_BURST_wt、SHORT_BURST_wt、LONG_BURST_wt,对应随机不同burst长度范围的权重,分别是AXI len=1、2~最大值/2、最大值/2+1~最大值,最大值要看是AXI3还是AXI4。

延时策略

对于上述可延时的信号,除了延时时间还可以修改延时策略,列举部分变量,其中wvalid和rvalid还可以分别配置burst中第1次和后续次的延时策略,相关变量如下。

svt_axi_transcation

rand reference_event_for_addr_valid_delay_enum  reference_event_for_addr_valid_delay = PREV_ADDR_HANDSHAKE;
rand reference_event_for_first_wvalid_delay_enum reference_event_for_first_wvalid_delay =  WRITE_ADDR_VALID;
rand reference_event_for_next_wvalid_delay_enum reference_event_for_next_wvalid_delay = PREV_WRITE_HANDSHAKE;
rand reference_event_for_rready_delay_enum reference_event_for_rready_delay = RVALID;
rand reference_event_for_bready_delay_enum reference_event_for_bready_delay = BVALID;

这里列举地址aw/rvalid的延时策略,延时cycle的计数起始可以是上一次aw/rvalid、上一次aw/r握手、第1次wvalid、第1次w握手、wlast握手。

  typedef enum {
    PREV_ADDR_VALID      =  `SVT_AXI_MASTER_TRANSACTION_PREV_ADDR_VALID_REF,
    PREV_ADDR_HANDSHAKE  =  `SVT_AXI_MASTER_TRANSACTION_PREV_ADDR_HANDSHAKE_REF,
    FIRST_WVALID_DATA_BEFORE_ADDR = `SVT_AXI_MASTER_TRANSACTION_FIRST_WVALID_DATA_BEFORE_ADDR,
    FIRST_DATA_HANDSHAKE_DATA_BEFORE_ADDR = `SVT_AXI_MASTER_TRANSACTION_FIRST_DATA_HANDSHAKE_DATA_BEFORE_ADDR,
    PREV_LAST_DATA_HANDSHAKE = `SVT_AXI_MASTER_TRANSACTION_PREV_LAST_DATA_HANDSHAKE
  } reference_event_for_addr_valid_delay_enum;

详细可以参照VIP安装目录下的 amba_axi_svt_faq.pdf ,单独有delay control的小节,包含带图说明的23小小节。
在这里插入图片描述

IDLE延时

valid信号无效期间,可以通过配置idle_*_delay变量使ready进行翻转,变量为动态数组形式,偶数序号为高电平,奇数为低电平,相关变量如下。

svt_axi_transcation

//slave active only
rand int idle_addr_ready_delay[];
rand int idle_wready_delay[];

//master active only
rand int idle_rready_delay[];
rand int idle_bready_delay[];

同时需要在port_cfg中开启翻转使能,相关变量如下。

svt_axi_port_configuration

rand bit toggle_ready_signals_during_idle_period = 1;

示例:地址IDLE配置为 '{1,2,3,4,5},可以看到AW通道握手之后,AWREADY在VALID无效期间翻转,具体行为为1周期高、2低、3高、4低、5高
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值