AXI Stream VIP包含在Synopsys AXI VIP中,可以使用axi_system_env_svt例化集成环境,也可以使用axi_master_agent_svt和axi_slave_agent_svt单独例化stream主/从环境
接口
接口使用svt_axi_if,svt_axi_if中包含可配置数量的svt_axi_master_if 和svt_axi_slave_if,其中又包含带t前缀的AXI Stream信号
配置类
和AXI VIP相同,系统配置类为svt_axi_system_configuration,每个主、从接口又有独立的配置类svt_axi_port_configuration,其中AXI Stream相关变量如下,主要是信号宽度和边带信号支持情况,像default_tready和AXI VIP中定义相似,可以配置ready常低常高
//svt_axi_port_configuration.sv
rand bit tready_enable = 1;
rand bit tkeep_enable = 1;
rand bit tstrb_enable = 1;
rand bit tid_enable = 1;
rand bit tdest_enable = 1;
rand bit tuser_enable = 1;
rand bit tdata_enable = 1;
rand bit tlast_enable = 1;
rand int tdata_width = `SVT_AXI_MAX_TDATA_WIDTH;
rand int tid_width = `SVT_AXI_MAX_TID_WIDTH;
rand int tdest_width = `SVT_AXI_MAX_TDEST_WIDTH;
rand int tuser_width = `SVT_AXI_MAX_TUSER_WIDTH;
rand bit byte_stream_enable = 1;
rand bit default_tready = 0;
传输类
传输类使用svt_axi_master_transaction,一次传输对应一次tlast,和AXI区别主要在类型需要修改为DATA_STREAM,同样包含数值类变量和延时,tvalid_delay有从上次valid和上次握手两种策略,tready_delay不支持多策略(2020版本)
//svt_axi_transaction.sv
rand xact_type_enum xact_type = DATA_STREAM;
rand reference_event_for_tvalid_delay_enum reference_event_for_tvalid_delay = PREV_TVALID_TREADY_HANDSHAKE;
rand int tvalid_delay[];
rand int tready_delay[];
rand bit [`SVT_AXI_MAX_TDATA_WIDTH - 1:0] tdata[];
rand bit [`SVT_AXI_TSTRB_WIDTH - 1:0] tstrb[];
rand bit [`SVT_AXI_TKEEP_WIDTH - 1:0] tkeep[];
rand bit [`SVT_AXI_MAX_TID_WIDTH - 1:0] tid = 0;
rand bit [`SVT_AXI_MAX_TDEST_WIDTH - 1:0] tdest;
rand bit [`SVT_AXI_MAX_TUSER_WIDTH - 1:0] tuser[];
rand int stream_burst_length = 1;
示例
示例使用axi_system_env_svt,包含1主1从
test_case和AXI相似,向master、slave发送sequence
master sequence中配置传输类,发送递增数据,发送1周期,间断1周期
`uvm_do_with(req,
{
stream_burst_length ==16;
xact_type == svt_axi_transaction::DATA_STREAM;
foreach(tdata[fi]) begin
tdata[fi] == cnt++;
tuser[fi] == 'h100 + cnt++;
tvalid_delay[fi] = 1;
end
}
slave sequence中配置传输类,配置ready延时,也为递增值
p_sequencer.response_request_port.peek(req_resp);
req_resp.randomize with {
foreach (tready_delay[i])
tready_delay[i] == i;
};
get_read_data_from_mem_to_transaction(req_resp);
$cast(req,req_resp);
`uvm_send(req)
从波形可以看到发送递增数,tvalid固定延时为1,tready延时为递增值