Dear Supporters, In IHI0050G CHI.G spec Chapter B13.9.3, Addr field width of SNP Flit is defined as Req_Addr_Width - 3, Meantime the Req_Addr_Width allowed range defined as 44 to 52. In IHI0098A CHI C2C spec Chapter B4.2.6, Addr field width of SNP message is defined as 48.
So my question is, when Req_addr_width in CHI been defined as 52, then Addr width of SNP will be defined as 49, but there are only 48 valid bit width in C2C SNP message, How is address transfer implemented from Addr in CHI SNP Flit to C2C SNP message?
Best Regards
Hi Lingfan, to understand this better, it’s helpful to first break down the address requirements for on-chip CHI snoops.
Snoop transactions themselves don’t carry a size field, so in theory, Addr[5:0] isn’t strictly necessary - Addr[6] and above are sufficient to support 64B granularity. However, Addr[5:4] are included to enable correct generation of the Critical Chunk Identifier (CCID) in the Snoopee’s Data response.
For non-DVM snoops, any Addr[4] and below are not functionally required.
For DVM snoops (see Table B8.10 in CHI Issue G), REQ.Addr[4] effectively maps to SNP.Addr[1], while SNP.Addr[0] is an extra bit added by the MN to distinguish between the first and second parts of the DVM message.
Together, this explains the relationship:
Snoop Address Width = Request Address Width - 3
For C2C, it’s important to note that DVMs do not follow the snoop path as they do in on-chip CHI. Instead, they’re converted into REQ+DAT transactions. Consequently, SNP.Addr[3] is not required in C2C, leading to a 4-bit reduction in the snoop address width compared to the request address width.
So, when mapping a “CHI SNP Flit” to a “C2C SNP”, you simply drop the bottom bit.
Hi Ben,
I got it cleared, thanks for the detailed description!
Just a small suggestion, I think it would be better for developers to understand, if you can add corresponding brief descriptions for SNP Addr width in future chi c2c spec release.
Anyway, thanks a lot, it's very helpful :D
Just got another question for SNP Address, so when the 48-bit Addr field remapping from C2C SNP message to CHI SNP Flit, since CHI SNP Flit will have 49-bit Addr width when Req_addr_width in CHI been defined as 52, What is the expected remapping behavior?
Best Regards.
Hi Lingfan, this would be:
OnChip.SNP.Addr[48:0] = {C2C.Snoop.Addr[47:0], 1'b0}
I see, So for scenarios where CHI Addr field less than 49-bit (e.g., 48-bit or 47-bit CHI SNP Addr), remapping behavior would be:
49-bit CHI SNP Addr: OnChip.SNP.Addr[48:0] = {C2C.Snoop.Addr[47:0], 1'b0}
48-bit CHI SNP Addr: OnChip.SNP.Addr[47:0] = C2C.Snoop.Addr[47:0]
47-bit CHI SNP Addr: OnChip.SNP.Addr[46:0] = C2C.Snoop.Addr[46:0]
Is that my understanding correct?
There may be some misunderstandings in my previous reply.
My current understanding is as follows:
For Req_Addr_Width = 52, SNP Addr width defined as Req_Addr_width – 3 = 49,
So the mapping between CHI <-> C2C would be:
CHI SNP -> C2C Snoop: C2C.Snoop.Addr[47:0] = CHI.SNP.Addr[48:1];
C2C Snoop -> CHI SNP: CHI.SNP.Addr[48:0] = {C2C.Snoop.Addr[47:0],1’b0];
So For Req_Addr_Width = 51, SNP Addr width defined as 51 – 3 = 48,
CHI SNP -> C2C Snoop: C2C.Snoop.Addr[47:0] = {1’b0,CHI.SNP.Addr[47:1]};
C2C Snoop -> CHI SNP: CHI.SNP.Addr[47:0] = {C2C.Snoop.Addr[46:0],1’b0];
Then For Req_Addr_Width = 50, SNP Addr width defined as 50 – 3 = 47,
CHI SNP -> C2C Snoop: C2C.Snoop.Addr[46:0] = {2’b0,CHI.SNP.Addr[46:1]};
C2C Snoop -> CHI SNP: CHI.SNP.Addr[46:0] = {C2C.Snoop.Addr[45:0],1’b0];
Please help me to confirm whether these mapping relationships are correct or not.
I‘m looking forward to your reply.