NUM_SWRITES表示待发送SWRITE事务的数量;
NUM_NWRITTES表示待发送的NWRITE_R事务的数量;
NUM_NWRITERS表示待发送NWRITER事务的数量;
NUM_NREADS表示待发送NREAD事务的数量;
NUM_DBS表示待发送DB事务的数量;
NUM_MSGS表示待发送的MSG事务的数量。
NUMBER_OF_INSTRUCTIONS为所有待发送事务的总数量
localparam NUM_SWRITES = SEND_SWRITE ? 37 : 0;
localparam NUM_NWRITERS = SEND_NWRITER ? 19 : 0;
localparam NUM_NWRITES = SEND_NWRITE ? 19 : 0;
localparam NUM_NREADS = SEND_NREAD ? 26 : 0;
localparam NUM_DBS = SEND_DB ? 2 : 0;
localparam NUM_MSGS = SEND_MSG ? 17 : 0;
localparam NUM_FTYPE9 = SEND_FTYPE9 ? 1 : 0;
localparam NUMBER_OF_INSTRUCTIONS = NUM_SWRITES + NUM_NWRITERS + NUM_NWRITES + NUM_NREADS + NUM_DBS + NUM_MSGS + NUM_FTYPE9;
以下代码定义了37个swrite个事务(stream流写事务),注意:{12'h000, SWRITE, 4'h0, 36'h000000777, 8'd0}不是一个swrite事务的HELLO格式的数据包;
在此,回顾一下swrite事务的HELLO格式数据包:
其中R代表保留,一般默认为0。
第一列的十二位数据12'h000,其中高8位为R(保留),因为swrite没有srcTiD。低4位分别表示1bit的R(保留)、2bit的prio、1bit的CRF。
第二列为4bit的FTYPE,swrite事务的FTYPY为4‘h6。
第三列为4bit的TTYPE,swrite事务的TTYPE为R,即0。
第四列为36bit的数据,高两位为R(保留),低34位为地址addr。
第五列为8位数据,表示size,swrite事务的size为R,即0。如果size不为0,不管为多少,目标Target会将size当成0来处理。
localparam [64*37-1:0] swrite_instruction = {
// RSVD, FTYPE, TTYPE, ADDRESS, SIZE
// SWRITEs
{12'h000, SWRITE, 4'h0, 36'h000000777, 8'd0},
{12'h000, SWRITE, 4'h0, 36'h000008806, 8'd0},
{12'h000, SWRITE, 4'h0, 36'h000000125, 8'd0},
{12'h000, SWRITE, 4'h0, 36'h000000124, 8'd0},
{12'h000, SWRITE, 4'h0, 36'h000000123, 8'd0},
{12'h000, SWRITE, 4'h0, 36'h000000122, 8'd0},
{12'h000, SWRITE, 4'h0, 36'h000000121, 8'd0},
{12'h000, SWRITE, 4'h0, 36'h000000120, 8'd0},
{12'h000, SWRITE, 4'h0, 36'h000000126, 8'd1},
{12'h000, SWRITE, 4'h0, 36'h000000124, 8'd1},
{12'h000, SWRITE, 4'h0, 36'h000000122, 8'd1},
{12'h000, SWRITE, 4'h0, 36'h000004350, 8'd1},
{12'h000, SWRITE, 4'h0, 36'h000004355, 8'd2},
{12'h000, SWRITE, 4'h0, 36'h000012300, 8'd2},
{12'h000, SWRITE, 4'h0, 36'h000012304, 8'd3},
{12'h000, SWRITE, 4'h0, 36'h000345000, 8'd3},
{12'h000, SWRITE, 4'h0, 36'h000345003, 8'd4},
{12'h000, SWRITE, 4'h0, 36'h004550000, 8'd4},
{12'h000, SWRITE, 4'h0, 36'h004550002, 8'd5},
{12'h000, SWRITE, 4'h0, 36'h198877600, 8'd5},
{12'h000, SWRITE, 4'h0, 36'h198877601, 8'd6},
{12'h000, SWRITE, 4'h0, 36'h2ABBCCDD8, 8'd6},
{12'h000, SWRITE, 4'h0, 36'h2ABBCCDD8, 8'd7},
{12'h000, SWRITE, 4'h0, 36'h2ABBCCDD8, 8'd15},
{12'h000, SWRITE, 4'h0, 36'h2ABBCCDD8, 8'd31},
{12'h000, SWRITE, 4'h0, 36'h120000600, 8'd63},
{12'h000, SWRITE, 4'h0, 36'h230000600, 8'd95},
{12'h000, SWRITE, 4'h0, 36'h340000600, 8'd127},
{12'h000, SWRITE, 4'h0, 36'h450000600, 8'd255},
{12'h000, SWRITE, 4'h0, 36'h560000600, 8'd15},
{12'h000, SWRITE, 4'h0, 36'h670000600, 8'd31},
{12'h000, SWRITE, 4'h0, 36'h780000600, 8'd63},
{12'h000, SWRITE, 4'h0, 36'h780000600, 8'd95},
{12'h000, SWRITE, 4'h0, 36'h890000600, 8'd127},
{12'h000, SWRITE, 4'h0, 36'h9A0000600, 8'd255},
{12'h000, SWRITE, 4'h0, 36'hAB0000600, 8'd15},
{12'h000, SWRITE, 4'h0, 36'hCD0000600, 8'd15}};
以下代码定义了19个NWRITE_R事务(写请求带响应的事务)。
第一列的十二位数据12'h000,其中高8位为srcTID。低4位分别表示1bit的R(保留)、2bit的prio、1bit的CRF。
第二列为4bit的FTYPE,NWRITE_R事务的FTYPY为4'h5。
第三列4bit的TNWR_R为TTYPE,值为4'h5。
第四列为36bit的数据,高两位为R(保留),低34位为地址addr。
第五列为8位数据,表示size。NWRITE_R的size不为R。其中,size为0,说明这次传输的数据个数为1。size为5,说明这次传输的数据个数为6。size的范围为0~255,表示传输的数据个数范围为1~256。
localparam [64*19-1:0] nwriter_instruction = {
// NWRITERs
{12'h000, NWRITE, TNWR_R, 36'h000000777, 8'd0},
{12'h000, NWRITE, TNWR_R, 36'h000008806, 8'd0},
{12'h000, NWRITE, TNWR_R, 36'h000000125, 8'd0},
{12'h000, NWRITE, TNWR_R, 36'h000000124, 8'd0},
{12'h000, NWRITE, TNWR_R, 36'h000000123, 8'd0},
{12'h000, NWRITE, TNWR_R, 36'h000000122, 8'd0},
{12'h000, NWRITE, TNWR_R, 36'h000000121, 8'd0},
{12'h000, NWRITE, TNWR_R, 36'h000000120, 8'd0},
{12'h000, NWRITE, TNWR_R, 36'h000000126, 8'd1},
{12'h000, NWRITE, TNWR_R, 36'h000000124, 8'd1},
{12'h000, NWRITE, TNWR_R, 36'h000000122, 8'd1},
{12'h000, NWRITE, TNWR_R, 36'h000004350, 8'd1},
{12'h000, NWRITE, TNWR_R, 36'h000004355, 8'd2},
{12'h000, NWRITE, TNWR_R, 36'h000012300, 8'd2},
{12'h000, NWRITE, TNWR_R, 36'h000012304, 8'd3},
{12'h000, NWRITE, TNWR_R, 36'h000345000, 8'd3},
{12'h000, NWRITE, TNWR_R, 36'h000345003, 8'd4},
{12'h000, NWRITE, TNWR_R, 36'h004550000, 8'd4},
{12'h000, NWRITE, TNWR_R, 36'h004550002, 8'd5}};
以下代码定义了19个NWRITE事务(写请求事务)。
第一列的十二位数据12'h000,其中高8位为srcTID。低4位分别表示1bit的R(保留)、2bit的prio、1bit的CRF。
第二列为4bit的FTYPE,NWRITE事务的FTYPY为4'h5。其中NWRITE事务(写请求事务)和NWRITE_R事务(写请求带响应的事务)的FTYPE相同。
第三列4bit的TNWR为TTYPE,值为4'h4。
第四列为36bit的数据,高两位为R(保留),低34位为地址addr。
第五列为8位数据,表示size。NWRITE的size不为R。其中,size为0,说明这次传输的数据个数为1。size为5,说明这次传输的数据个数为6。size的范围为0~255,表示传输的数据个数范围为1~256。
localparam [64*19-1:0] nwrite_instruction = {
// NWRITEs
{12'h000, NWRITE, TNWR, 36'h198877600, 8'd5},
{12'h000, NWRITE, TNWR, 36'h198877601, 8'd6},
{12'h000, NWRITE, TNWR, 36'h2ABBCCDD8, 8'd6},
{12'h000, NWRITE, TNWR, 36'h2ABBCCDD8, 8'd7},
{12'h000, NWRITE, TNWR, 36'h2ABBCCDD8, 8'd15},
{12'h000, NWRITE, TNWR, 36'h2ABBCCDD8, 8'd31},
{12'h000, NWRITE, TNWR, 36'h120000600, 8'd63},
{12'h000, NWRITE, TNWR, 36'h230000600, 8'd95},
{12'h000, NWRITE, TNWR, 36'h340000600, 8'd127},
{12'h000, NWRITE, TNWR, 36'h450000600, 8'd255},
{12'h000, NWRITE, TNWR, 36'h560000600, 8'd15},
{12'h000, NWRITE, TNWR, 36'h670000600, 8'd31},
{12'h000, NWRITE, TNWR, 36'h780000600, 8'd63},
{12'h000, NWRITE, TNWR, 36'h890000600, 8'd95},
{12'h000, NWRITE, TNWR, 36'h9A0000600, 8'd127},
{12'h000, NWRITE, TNWR, 36'hAB0000600, 8'd255},
{12'h000, NWRITE, TNWR, 36'hBC0000600, 8'd15},
{12'h000, NWRITE, TNWR, 36'hCD0000600, 8'd15},
{12'h000, NWRITE, TNWR, 36'hDE0000600, 8'd15}};
以下代码定义了26个NREAD事务(读请求事务)。
第一列的十二位数据12'h000,其中高8位为srcTID。低4位分别表示1bit的R(保留)、2bit的prio、1bit的CRF。
第二列为4bit的FTYPE,NREAD事务的FTYPY为4'h2。
第三列4bit的TNRD为TTYPE,值为4'h4。
第四列为36bit的数据,高两位为R(保留),低34位为地址addr。
第五列为8位数据,表示size。NREAD的size不为R。其中,size为0,说明这次传输的数据个数为1。size为5,说明这次传输的数据个数为6。size的范围为0~255,表示传输的数据个数范围为1~256。
localparam [64*26-1:0] nread_instruction = {
// NREADs
{12'h000, NREAD, TNRD, 36'h000002307, 8'd00},
{12'h000, NREAD, TNRD, 36'h000002406, 8'd00},
{12'h000, NREAD, TNRD, 36'h000002505, 8'd00},
{12'h000, NREAD, TNRD, 36'h000002604, 8'd00},
{12'h000, NREAD, TNRD, 36'h000002703, 8'd00},
{12'h000, NREAD, TNRD, 36'h000002802, 8'd00},
{12'h000, NREAD, TNRD, 36'h000002301, 8'd00},
{12'h000, NREAD, TNRD, 36'h000002400, 8'd00},
{12'h000, NREAD, TNRD, 36'h000002506, 8'd01},
{12'h000, NREAD, TNRD, 36'h000002604, 8'd01},
{12'h000, NREAD, TNRD, 36'h000002702, 8'd01},
{12'h000, NREAD, TNRD, 36'h000002800, 8'd01},
{12'h000, NREAD, TNRD, 36'h000002305, 8'd02},
{12'h000, NREAD, TNRD, 36'h000002400, 8'd02},
{12'h000, NREAD, TNRD, 36'h000002504, 8'd03},
{12'h000, NREAD, TNRD, 36'h000002600, 8'd03},
{12'h000, NREAD, TNRD, 36'h000002703, 8'd04},
{12'h000, NREAD, TNRD, 36'h000002800, 8'd04},
{12'h000, NREAD, TNRD, 36'h000002502, 8'd05},
{12'h000, NREAD, TNRD, 36'h000002600, 8'd05},
{12'h000, NREAD, TNRD, 36'h000002701, 8'd06},
{12'h000, NREAD, TNRD, 36'h000002800, 8'd06},
{12'h000, NREAD, TNRD, 36'h0000023F0, 8'd07},
{12'h000, NREAD, TNRD, 36'h000002400, 8'd15},
{12'h000, NREAD, TNRD, 36'h000002500, 8'd31},
{12'h000, NREAD, TNRD, 36'h000002600, 8'd63}};
以下代码定义了2个DOORB事务(门铃事务)。
第一列的十二位数据12'h000,其中高8位为srcTID。低4位分别表示1bit的R(保留)、2bit的prio、1bit的CRF。
第二列为4bit的FTYPE,DOORB事务的FTYPY为4'hA。
第三列为4bit的TTYPE,DOORB事务的TTYPE为R,即0。
第四列为36bit的数据,高四位为R(保留),中间8bit为 info MSB,另外8bit为info LSB,最低16bit为R(保留),即0。info MSB 和 info LSB是什么意思,笔者暂时也不太清楚
第五列为8位数据,表示size,DOORB事务的size为R,即0。如果size不为0,不管为多少,目标Target会将size当成0来处理。
localparam [64*2-1:0] db_instruction = {
// DOORBELLs
{12'h000, DOORB, 4'b0, 36'h0DBDB0000, 8'd01},
{12'h000, DOORB, 4'b0, 36'h044440000, 8'd01}};
以下代码定义了17个MESSG事务(消息事务)。
第一列的十二位数据12'h000,其中高8位为4bit的msglen和4bit的msgseg,低4位分别表示1bit的R(保留)、2bit的prio、1bit的CRF。
第二列为4bit的FTYPE,MESSG事务的FTYPY为4'hB。
第三列为4bit的TTYPE,MESSG事务的TTYPE为R(保留),即0。
第四列为36bit的数据,其中高26bit为R(保留),6bit的mailbox,2bit的R,2bit的ltr。
第五列为8位数据,表示size。MESSG的size不为R。其中,size为0,说明这次传输的数据个数为1。size为5,说明这次传输的数据个数为6。size的范围为0~255,表示传输的数据个数范围为1~256。
localparam [64*17-1:0] msg_instruction = {
// MESSAGEs
{12'h000, MESSG, 4'b0, 36'h000000002, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000012, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000022, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000002, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000012, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000022, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000002, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000012, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000022, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000002, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000012, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000022, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000002, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000012, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000022, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000002, 8'd07},
{12'h000, MESSG, 4'b0, 36'h000000012, 8'd07}};
以下代码定义了1个DATA stream事务。
第一列的十二位数据12'h000,其中高8位表示“S,E,R,xh,O,P”,低4位分别表示1bit的R(保留)、2bit的prio、1bit的CRF。
第二列为4bit的FTYPE,DATA stream事务的FTYPY为4'h9。
第三列为4bit的TTYPE,DATA stream事务的TTYPE为R(保留),即0。
第四列为36bit的数据,其实高4位为R(保留),中间16bit为streamID,低16位为Length。
第五列为8位数据,表示size。DATA stream的size不为R。其中,size为0,说明这次传输的数据个数为1。size为5,说明这次传输的数据个数为6。size的范围为0~255,表示传输的数据个数范围为1~256。
localparam [64*1-1:0] ftype9_instruction = {
// FTYPE9
{12'h000, FTYPE9, 4'b0, 36'h0DBDB1000, 8'd7}};