Chủ Nhật, 25 tháng 8, 2019

[Arbiter] Bài 5 - Bộ phân xử Round Robin cân bằng

Bài viết này trình bày một cách thiết kế bộ phân xử Round Robin (RR) với mức độ cân bằng quyền truy cập (được grant) cao. Bộ phân xử này giúp giữ nguyên mức ưu tiên cho các nguồn request đang giữ mức ưu tiên cao nhưng chưa được grant. Điều này giúp các nguồn chưa được grant luôn được ưu tiên hơn các nguồn đã được grant trước đó từ đó khắc phục nhược điểm của cách thiết kế trong bài 3bài 4.
Tác giả gửi lời cảm ơn đến anh Nguyễn Phú Quốc, một kỹ sư thiết kế vi mạch số, đã hỗ trợ giải thích ý tưởng cho cách thiết kế này.

1) Mô tả tổng quan thiết kế
Như đã trình bày trong bài 3bài 4, một nhược điểm lớn của hai cách thiết kế này là "sự cân bằng" trong việc cấp phát quyền truy cập không cao. Thiết kế trong bài này có nhiều mạch logic giống với bài 2.
Hình 1: Sơ đồ nguyên lý tổng quan của giải thuật Round Robin cân bằng
Giải thuật Round Robin cân bằng gồm các thành phần sau:
  1. Priority level register: Thanh ghi lưu mức ưu tiên của nguồn request. Thanh ghi này sẽ thay đổi giá trị tùy vào sự cấp phát quyền truy cập hiện tại. Việc thay đổi giá trị thanh ghi sẽ làm thay đổi mức ưu tiên của nguồn request.
  2. Priority selection: Logic xác định mức ưu tiên của nguồn request và tạo ra các tín hiệu request phụ ứng với mức ưu tiên hiện tại.
  3. Asserted request check: Kiểm tra mức ưu tiên nào có request đang tích cực và nhóm các tín hiệu request phụ có cùng mức ưu tiên với nhau
  4. Request enable: Tạo tín hiệu cho phép lựa chọn nguồn request có mức ưu tiên cao nhất đang tích cực. Chỉ một tín hiện enable tích cực ở mạch logic này và tín hiệu này chỉ ra "mức ưu tiên nào" đang có request tích cực.
  5. Request mask: Che (mask) tất cả các tín hiệu request phụ sinh ra từ logic "ASSERTED REQUEST CHECK" bằng tín hiệu enable của sinh ra từ logic "REQUEST ENABLE". Ngõ ra của logic này chỉ còn duy nhất một request đang tích cực có mức ưu tiên cao nhất ở thời điểm hiện tại tích cực.
  6. Next grant: Tạo giá trị cập nhật lái ngõ ra grant cấp phát quyền truy cập cho nguồn request được chọn ở bước 5.
  7. Grant: Thanh ghi lưu giá trị cấp phát quyền truy cập hiện tại.
Các lưu ý quan trọng:
  1. Logic từ 2 đến 6 hoàn toàn chỉ là mạch tổ hợp.
  2. Ngõ vào của các nguồn request (req[REQ_NUM-1:0]) được đưa vào mạch logic số 2.
  3. Ngõ ra grant[REQ_NUM-1:0] là các Flip-Flop (FF) sinh ra từ logic số 7.
  4. Mạch logic 1 chỉ là thanh ghi nội, tựu động cập nhật giá trị để điều khiển logic 2.
Hoạt động của bộ phân xử RR này là sử dụng các thanh ghi quy định mức ưu tiên của các nguồn request. Một nguồn request có một thanh ghi với động rộng bit bằng logarit cơ số 2 của số nguồn request, tức là log2(REQ_NUM). Giá trị các thanh ghi này sẽ cập nhật tự động theo nguyên tắc sau:
  • Thanh ghi mức ưu tiên của mỗi nguồn request được nạp một giá trị khởi tạo khác nhau khi reset.
  • Mỗi giá trị đại diện cho một mức ưu tiên khác nhau
  • Giá trị thanh ghi sẽ cập nhật sau mỗi lần phân xử. Nguồn request vừa được grant thì giá trị thanh ghi mức ưu tiên sẽ được thiết lập đến mức ưu tiên thấp nhất. Nguồn request có mức ưu tiên cao hơn nguồn request vừa được grant thì giá trị thanh ghi giữ nguyên. nguồn request có mức ưu tiên thấp hơn nguồn request vừa được grant thì giá trị thanh ghi được tăng lên mức ưu tiên cao hơn.
2) Mô tả chi tiết thiết kế
RTL code có thể hơi phức tạp nên tác giả sẽ trình bày mạch logic kèm RTL code tương ứng để bạn đọc có thể phân tích.
2.1) Thanh ghi mức ưu tiên (1)
Thanh ghi lưu giá trị ưu tiên của mỗi nguồn request là điểm khác biệt quan trọng so với các cách thiết kế trước.
Hình 2: Cấu trúc thanh ghi pReg lưu mức ưu tiên của các nguồn request
Thanh ghi này có hoạt động như sau:
  • Reset đến một giá trị khởi tạo. Trong thiết kế này, giá trị 0 ứng với mức ưu tiên cao nhất, giá trị REQ_NUM-1 ứng với mức ưu tiên thấp nhất. Từ phải qua trái, giá trị reset của pReg ứng với mỗi nguồn request sẽ là 0, 1, 2, ..., REQ_NUM-1.
  • Chỉ cập nhật giá trị mới tại thời điểm không có bất cứ grant nào (noGrant=1) và có ít nhất 1 nguồn đang request (một hoặc nhiều bit của tín hiệu req tích cực)
  • Khi được phép cập nhật, giá trị cập nhật sẽ là một trong 2 giá trị sau:
    • REQ_NUM - 1 nếu nguồn được grant. Đây là mức ưu tiên thấp nhất.
    • "Giảm 1 đơn vị" nếu mức ưu tiên thấp hơn hoặc bằng mức ưu tiên của nguồn được grant, tức giá trị pReg lớn hơn hoặc bằng pReg của nguồn được grant.
Ví dụ, chúng ta có 4 nguồn request. Sau khi reset, giá trị pReg như sau:
  • pReg[1:0] = 0 (mức ưu tiên cao nhất, dành cho req[0])
  • pReg[3:2] = 1 (dành cho req[1])
  • pReg[5:4] = 2 (dành cho req[2])
  • pReg[7:6] = 3 (mức ưu tiên thấp nhất, dành cho req[3])
Giả sử,  req[1] được grant, giá trị pReg như sau:
  • pReg[1:0] = 0 (mức ưu tiên cao nhất, dành cho req[0])
  • pReg[3:2] = 3 (mức ưu tiên thấp nhất, dành cho req[1])
  • pReg[5:4] = 1 (dành cho req[2])
  • pReg[7:6] = 2 (dành cho req[3])
pReg[3:2] = 3 vì req[1] được grant nên nó bị chuyển về mức ưu tiên thấp nhất và nhường ưu tiên cao cho các nguồn khác chưa được grant. pReg[1:0] = 0 (giá trị không đổi) vì req[0] ưu tiên cao hơn req[1] nhưng chưa được grant nên mức ưu tiên được bảo toàn. pReg[5:4] và pReg[7:6] giảm 1 đơn vị vì req[2] và req[3] đang ưu tiên thấp hơn req[1] nên được tăng mức ưu tiên khi req[1] được grant.
Hình 3: Mạch nguyên lý của thanh ghi pReg
Ví dụ 1: RTL code của pReg

generate
  genvar i;
   for (i = 0; i < REQ_NUM; i = i+1) 
   begin: pRegGen
    always @ (posedge clk, negedge rst_n) begin
      if (~rst_n)
   pReg[COUNTER_W*(i+1)-1:i*COUNTER_W] <= i;
   //Set to lowest priority level after granting
   else if (updateP) begin
     if (nextGrant[i])
       pReg[COUNTER_W*(i+1)-1:i*COUNTER_W] <
              = REQ_NUM - 1;
     else if (pReg[COUNTER_W*(i+1)-1:i*COUNTER_W]
        >= cPriorityLevel[COUNTER_W*REQ_NUM-1:
            (REQ_NUM-1)*COUNTER_W])
     //Increase the higher priority level
     //by minusing 1
     //if the current priority level
     //is different from 0 
        pReg[COUNTER_W*(i+1)-1:i*COUNTER_W] <= 
        pReg[COUNTER_W*(i+1)-1:i*COUNTER_W] - 1;
         end
      end
    end
  endgenerate
Trong đó, bộ so sánh "lớn hơn hoặc bằng" trong hình trên sẽ lấy giá trị so sánh từ mạch logic xác định giá trị mức ưu tiên của nguồn request sẽ được grant.
Hình 4: Mạch xác định giá trị ưu tiên của nguồn request sẽ được grant
Ví dụ 2: RTL code của mạch xác định giá trị ưu tiên của nguồn request sẽ được grant

generate
    genvar i0;
    assign cPriorityLevel[COUNTER_W-1:0] = 
           nextGrant[0]? 
           pReg[COUNTER_W-1:0]: 
           {COUNTER_W{1'b0}};
    for (i0 = 1; i0 < REQ_NUM; i0 = i0+1)
    begin: cPValue
     assign cPriorityLevel[COUNTER_W*(i0+1)-1:
         i0*COUNTER_W]
         = nextGrant[i0]?
         pReg[COUNTER_W*(i0+1)-1:i0*COUNTER_W]
         : cPriorityLevel[COUNTER_W*i0-1:
         (i0-1)*COUNTER_W];
    end
  endgenerate
Giá trị dùng để so sánh chính là các bit MSB của cPriorityLevel (cPriorityLevel[COUNTER_W*REQ_NUM-1:(REQ_NUM-1)*COUNTER_W]). Vì mỗi thời điểm chỉ có 1 nguồn request được grant nên chỉ có 1 nextGrant tích cực. Điều này làm cho mạch logic trên chọn được giá trị mức ưu tiên của nguồn request sẽ được grant (nguồn có nextGrant bằng 1).
2.2)  Logic xác định mức ưu tiên (2)
Dựa trên giá trị mức ưu tiên của pReg, nếu nguồn request tích cực, nó sẽ làm tích cực một trong các bit ngõ ra levelReq của mạch này. Mỗi bit ngõ ra gọi là một request phụ.
Hình 5: Cấu trúc của tín hiệu request phụ levelReq
Hình 6: Mạch nguyên lý tạo các tín hiệu request phụ cho các nguồn request
Ví dụ, xem xét bộ DEMUX đầu tiên, ngõ vào của bộ DEMUX là nguồn req[0] và giá trị mức ưu tiên hiện tại của req[0]pReg[COUNTER_W-1:0]. Tùy vào giá trị mức ưu tiên, có thể từ 0 đến REQ_NUM-1, mà req[0] sẽ được nối đến một ngbit ngõ ra levelReq. levelReq[REQ_NUM-1:0] là các tín hiệu request phụ của req[0]. Tại một thời điểm, chỉ một bit của tín hiệu này nối đến req[0] nên nếu req[0] tích cực thì cũng chỉ có một trong các bit của tín hiệu levelReq[REQ_NUM-1:0] tích cực.
Ví dụ 3: RTL code của logic tạo tín hiệu request phụ

generate
    genvar j0;
    genvar j1;
    for (j0=0; j0 < REQ_NUM; j0=j0+1) 
    begin: reqSel
      for (j1=0; j1 < REQ_NUM; j1=j1+1) 
      begin: selOut
        //levelReq[*] is asserted if req[j0]
        //asserted and the priority level
        //is mapped
        assign levelReq[j0*REQ_NUM+j1] =
        req[j0] & 
        (pReg[COUNTER_W*(j0+1)-1:j0*COUNTER_W]
        == j1); 
      end
    end
 endgenerate
2.3) Mạch kiểm tra request tích cực (3)
Nhóm các tín hiệu request phụ của tất cả các request theo mức ưu tiên bằng logic OR để xác định xem nhóm nào đang có request tích cực.
Hình 7: Mạch nguyên lý kiểm tra mức tích cực của các nhóm ưu tiên
Ví dụ, REQ_NUM=4 ứng với 4 nguồn request, req[3:0], được sử dụng thì:
orAssertedReq[0] = levelReq[0] | levelReq[4] | levelReq[8] levelReq[12]
Các bit levelReq này là tín hiệu request phụ của các request khi mức ưu tiên của các request là 0. Khi OR các bit theo nhóm mức ưu tiên giúp xác định nhóm ưu tiên nào đang có request tích cực. Nhờ thôn tin này, các request sẽ được phân xử.
Ví dụ 4: RTL code của logic kiểm tra mức tích cực của các nhóm ưu tiên

generate
  genvar k0;
  for (k0=0; k0 < REQ_NUM; k0=k0+1)
  begin: AChk
    assign orAssertedReq[k0] = 
    orOut(levelReq[REQ_NUM*REQ_NUM-1:0],k0);
  end
endgenerate
2.4) Tín hiệu enable cho mỗi nhóm request (4)
Tín hiệu enable được tạo để xác định nhóm request phụ (có request đang tích cực) nào sẽ được grant. Chỉ duy nhất 1 enable tích cực ở mạch logic này.
Hình 8: Mạch nguyên lý tạo tín hiệu cho phép reqEn
Từ thông tin nhóm ưu tiên nào đang có request tích cực ở logic (3), logic này là mạch phân xử tạo ra tín hiệu cho phép request ở mức ưu tiên nào được phép grant. Nguyên tắc chung, nhóm request phụ có mức ưu tiên 0 (orAssertedReq[0]) được ưu tiên cao nhất, nhóm request phụ có mức ưu tiên REQ_NUM-1 (orAssertedReq[REQ_NUM-1]) có ưu tiên thấp nhất.
Ví dụ 5: Logic tạo tín hiệu cho phép xét theo mức ưu tiên

generate
  genvar k1;
  assign reqEn[0] = orAssertedReq[0];
  for (k1=1; k1 < REQ_NUM; k1=k1+1) 
  begin: ReqEnable
    assign reqEn[k1] = orAssertedReq[k1] &
    ~|orAssertedReq[k1-1:0];
  end
endgenerate

2.5) Che các tín hiệu request phụ (5)
reqEn sẽ được sử dụng để che (mask) các bit request phụ trong mỗi nhóm levelReq. Chỉ bit request phụ đang tích cực có mức ưu tiên cao nhất được tích cực.
Hình 9: Mạch nguyên lý mask các bit request phụ của từng nguồn request
Giả sử có 4 nguồn request, req[3:0], và mức ưu tiên của req[3] đến req[0] theo thứ tự từ 3 (thấp nhất) đến 0 (cao nhất). Lúc này, req[1]req[2] tích cực (bằng 1), mức ưu tiên cao nhất đang có request tích cực là mức 1 nên chỉ có reqEn[1]=1. Khi reqEn[3:0] AND với các bit request phụ levelReq của các nguồn request thì chỉ có tín hiệu request phụ mức ưu tiên 1 được hoạt động, các request phụ mức ưu tiên 0, 2 và 3 bị che (mask) về 0. Cụ thể, trường hợp này:
  • newGrant[1] = levelReq[0] = 0 (vì req[0] không tích cực)
  • newGrant[5] = levelReq[1] = 1 (vì req[1]=1 và req[0] không tích cực nên reqEn[1]=1)
  • newGrant[9] = levelReq[2] = 0 (vì req[2]=1 nhưng mức ưu tiên thấp hơn req[1])
  • newGrant[13] = levelReq[3]=0
Ví dụ 6: RTL code của logic mask các tín hiệu request phụ

generate
  genvar k2a;
  genvar k2b;
  for (k2a=0; k2a < REQ_NUM; k2a=k2a+1) 
  begin: ReqMask
    for (k2b=0; k2b < REQ_NUM; k2b=k2b+1)
    begin: BitMask
      assign newGrant[k2b+k2a*REQ_NUM] = 
      levelReq[k2b+k2a*REQ_NUM] & reqEn[k2b];
    end
  end
endgenerate

Trong RTL code trên, k2a dùng để chọn nhóm tín hiệu request phụ, k2b dùng để chọn từng bit trong nhóm tín hiệu request phụ levelReq.
2.6) Tạo giá trị cập nhật tín hiệu grant (6)
Sau khi mask các bit của levelReq để tạo ra newGrant, để xác định một nguồn request có được grant hay không thì chỉ cần OR tất các bit newGrant của một nguồn request lại.
Hình 10: Tín hiệu cho biết nguồn request nào sẽ được grant sau khi phân xử
Chỉ một bit trong tín hiệu finalNewGrant tích cực để chỉ ra nguồn nào được grant. Tín hiệu này được đưa đến logic tạo giá trị để lái tín hiệu ngõ ra grant[REQ_NUM-1:0]. Logic này xem xét 2 trường hợp:
  • Nếu không có bất kỳ nguồn nào đang được grant (noGrant=1) thì grant[REQ_NUM-1:0] cập nhật giá trị từ finalNewGrant[REQ_NUM-1:0]
  • Nếu có một nguồn request đang được grant thì giá trị grant[REQ_NUM-1:0] giữ nguyên theo mức tích cực của request. Khi nào request hiện tại thôi tích cực, bằng 0, thì grant tương ứng cũng thôi tích cực và chuyển về trạng thái noGrant.  %3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212354.500000000002%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212354.500000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%223%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212406.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212406.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%224%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212386.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212386.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%225%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212432%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212432%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%226%22%20value%3D%22MUX%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%23000000%3Balign%3Dcenter%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212334.5%22%20width%3D%2280%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%227%22%20value%3D%22%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%236600CC%3Balign%3Dright%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212374.5%22%20width%3D%2280%22%20height%3D%22130%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%228%22%20value%3D%220%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2212394.5%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%229%22%20value%3D%221%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2212454.5%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2210%22%20value%3D%22noGrant%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224886%22%20y%3D%2212314.5%22%20width%3D%2296%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2211%22%20value%3D%22%22%20style%3D%22shape%3Dor%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BstrokeColor%3D%23000000%3BstrokeWidth%3D3%3BfillColor%3D%23FFFFFF%3BfontSize%3D23%3BfontColor%3D%23FF0000%3Balign%3Dright%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224846%22%20y%3D%2212372.5%22%20width%3D%2240%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2212%22%20value%3D%22%26lt%3Bdiv%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%26lt%3Bspan%26gt%3Bgrant%5B0%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%26lt%3B%2Fdiv%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224682%22%20y%3D%2212347%22%20width%3D%22144%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2213%22%20value%3D%22req%5B0%26lt%3Bspan%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224682%22%20y%3D%2212393%22%20width%3D%22144%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2214%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3BexitX%3D1.012%3BexitY%3D0.423%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3B%22%20edge%3D%221%22%20source%3D%227%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%225182%22%20y%3D%2212428.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225262.000000000002%22%20y%3D%2212428.000000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2215%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224732%22%20y%3D%2212479%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212477.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2216%22%20value%3D%22finalNewGrant%5B0%5D%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224762%22%20y%3D%2212450%22%20width%3D%22224%22%20height%3D%2223%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2217%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212590.500000000002%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212590.500000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2218%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212642.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212642.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2219%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212622.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212622.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2220%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212668.000000000002%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212668.000000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2221%22%20value%3D%22MUX%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%23000000%3Balign%3Dcenter%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212570.5%22%20width%3D%2280%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2222%22%20value%3D%22%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%236600CC%3Balign%3Dright%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212610.5%22%20width%3D%2280%22%20height%3D%22130%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2223%22%20value%3D%220%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2212630.5%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2224%22%20value%3D%221%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2212690.5%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2225%22%20value%3D%22noGrant%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224886%22%20y%3D%2212550.5%22%20width%3D%2296%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2226%22%20value%3D%22%22%20style%3D%22shape%3Dor%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BstrokeColor%3D%23000000%3BstrokeWidth%3D3%3BfillColor%3D%23FFFFFF%3BfontSize%3D23%3BfontColor%3D%23FF0000%3Balign%3Dright%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224846%22%20y%3D%2212608.5%22%20width%3D%2240%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2227%22%20value%3D%22%26lt%3Bdiv%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%26lt%3Bspan%26gt%3Bgrant%5B1%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%26lt%3B%2Fdiv%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224682%22%20y%3D%2212583%22%20width%3D%22144%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2228%22%20value%3D%22req%5B1%26lt%3Bspan%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224682%22%20y%3D%2212629%22%20width%3D%22144%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2229%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3BexitX%3D1.012%3BexitY%3D0.432%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3B%22%20edge%3D%221%22%20source%3D%2222%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%225182%22%20y%3D%2212664.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225262.000000000002%22%20y%3D%2212664%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2230%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224732%22%20y%3D%2212715%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212713.499999999998%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2231%22%20value%3D%22finalNewGrant%5B1%5D%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224762%22%20y%3D%2212686%22%20width%3D%22224%22%20height%3D%2223%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2232%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212960%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212960%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2233%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2213012%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2213012%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2234%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212992%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212992%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2235%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2213037.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2213037.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2236%22%20value%3D%22MUX%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%23000000%3Balign%3Dcenter%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212940%22%20width%3D%2280%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2237%22%20value%3D%22%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%236600CC%3Balign%3Dright%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212980%22%20width%3D%2280%22%20height%3D%22130%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2238%22%20value%3D%220%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2213000%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2239%22%20value%3D%221%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2213060%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2240%22%20value%3D%22noGrant%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224886%22%20y%3D%2212920%22%20width%3D%2296%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2241%22%20value%3D%22%22%20style%3D%22shape%3Dor%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BstrokeColor%3D%23000000%3BstrokeWidth%3D3%3BfillColor%3D%23FFFFFF%3BfontSize%3D23%3BfontColor%3D%23FF0000%3Balign%3Dright%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224846%22%20y%3D%2212978%22%20width%3D%2240%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2242%22%20value%3D%22%26lt%3Bdiv%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%26lt%3Bspan%26gt%3Bgrant%5B3%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%26lt%3B%2Fdiv%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224701%22%20y%3D%2212953%22%20width%3D%22125%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2243%22%20value%3D%22req%5B3%26lt%3Bspan%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224705%22%20y%3D%2212999%22%20width%3D%22121%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2244%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3BexitX%3D1.024%3BexitY%3D0.417%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3B%22%20edge%3D%221%22%20source%3D%2237%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%225182%22%20y%3D%2213034%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225262.000000000002%22%20y%3D%2213033.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2245%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224732%22%20y%3D%2213084.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2213083.000000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2246%22%20value%3D%22finalNewGrant%5BREQ_NUM-1%5D%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224684%22%20y%3D%2213056%22%20width%3D%22302%22%20height%3D%2223%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2247%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D0%3Bdashed%3D1%3BstrokeColor%3D%236600CC%3Balign%3Dright%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%225041%22%20y%3D%2212900%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225042%22%20y%3D%2212760.999999999998%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2248%22%20value%3D%22nextGrant%26lt%3Bspan%26gt%3B%5B0%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225095%22%20y%3D%2212390%22%20width%3D%22158%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2249%22%20value%3D%22nextGrant%26lt%3Bspan%26gt%3B%5B1%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225095%22%20y%3D%2212629%22%20width%3D%22158%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2250%22%20value%3D%22nextGrant%26lt%3Bbr%26gt%3B%26lt%3Bspan%26gt%3B%5BREQ_NUM-1%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225095%22%20y%3D%2212965%22%20width%3D%22158%22%20height%3D%2260%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2251%22%20value%3D%22%26lt%3Bfont%20style%3D%26quot%3Bfont-size%3A%2027px%26quot%3B%26gt%3Bvlsi%20technology%26lt%3B%2Ffont%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3D%23FFFFCC%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D18%3BfontColor%3D%23FF0000%3BfontStyle%3D1%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224700%22%20y%3D%2212794.5%22%20width%3D%22279%22%20height%3D%2255%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Hình 11: Tín hiệu nextGrant
Ví dụ 7: RTL code của logic tạo nextGrant

generate
  genvar k3;
  for (k3=0; k3 < REQ_NUM; k3=k3+1) 
  begin: FNewGrant
    assign finalNewGrant[k3] = 
    |newGrant[REQ_NUM*(k3+1)-1:k3*REQ_NUM];
  end
endgenerate
assign noGrant = ~|grant[REQ_NUM-1:0];
assign nextGrant[REQ_NUM-1:0] = noGrant? 
   finalNewGrant[REQ_NUM-1:0]: 
   grant[REQ_NUM-1:0] & req[REQ_NUM-1:0];

2.7) Thanh ghi grant (7)
Thanh ghi grant cập nhật giá trị từ nextGrant theo từng chu kỳ clock.
Hình 12: Thanh ghi grant và tín hiệu noGrant
Ví dụ 8: RTL code của thanh ghi grant

always @ (posedge clk, negedge rst_n) begin
  if (~rst_n)
    grant[REQ_NUM-1:0] <= {REQ_NUM{1'b0}};
  else
    grant[REQ_NUM-1:0] <= nextGrant[REQ_NUM-1:0];
end

Chú ý, RTL code có sử dụng 2 function đã được giải thích trong các bài viết trước, các bạn tham khảo lại các bài viết này.
3) Kết quả mô phỏng và nhận xét
Sau đây là một waveform minh họa hoạt động của bộ arbiter trong bài viết này với REQ_NUM=4. Tác giả chỉ giải thích lần grant đầu tiên trong waveform, bạn đọc có thể tiếp tục phân tích để kiểm chứng và hiểu thêm.
Hình 13: Một waveform minh họa hoạt động của arbiter
Nhận xét, thiết kế này có độ cân bằng cao về khả năng cấp phát quyền truy cập khi gán mức ưu tiên thấp nhất cho nguồn request vừa được grant và làm cho các nguồn request chưa được grant có mức ưu tiên cao hơn. Như vậy, một nguồn request sẽ không được grant liên tiếp trừ khi các nguồn request có mức ưu tiên cao hơn nó không phát request.
Tuy nhiên, thiết kế này có tốn tài nguyên nhất so với các cách thiết kế trình bày trong các bài trước.

Dữ liệu có thể tải:
Source code trên Github

Lịch sử cập nhật:
1) 2019.Aug.25 - Tạo lần đầu

0 bình luận:

Đăng nhận xét