Advertisement
Guest User

112

a guest
Nov 30th, 2015
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.08 KB | None | 0 0
  1. _NUMBER 2
  2.  
  3. VAR DATA_WDT AGENT_RESPONSE_DESC.DATA_WDT
  4.  
  5. ITER N $AGENT_NUMBER
  6. MODULE
  7.  
  8.  
  9. input (AGENT_REQ_DESC+) qpc_req$N;
  10. output (AGENT_RESPONSE_DESC-) qpc_response$N;
  11.  
  12. input clk;
  13. input reset;
  14.  
  15. wire (AGENT_REQ_DESC+) s0_qpc_gnt;
  16.  
  17. wire [LOG2($AGENT_NUMBER)-1:0] s0_agent_gntid;
  18.  
  19. g_arbiter #(DESC = AGENT_REQ_DESC+, AGENT_NUM = $AGENT_NUMBER, IO_CHOSEN_ID = 1) g_arbiter_agent (
  20. .in$N (qpc_req$N),
  21. .chosen (s0_qpc_gnt),
  22. .chosen_id(s0_agent_gntid));
  23. wire (AGENT_REQ_DESC-) s0_qpc_gnt_post_tap;
  24. g_tap #(DESC = AGENT_REQ_DESC-) g_tap_pipe_entrance (
  25. .in (s0_qpc_gnt),
  26. .out (s0_qpc_gnt_post_tap),
  27. .tap_enable (1'b1)
  28.  
  29. );
  30.  
  31. /////////////////////////////////////////////////////////////////////////
  32. /// s1 - Stall and wait for Sram array
  33. ////////////////////////////////////////////////////////////////////////
  34.  
  35.  
  36.  
  37. wire [LOG2($AGENT_NUMBER)-1:0] s1_agent_gntid;
  38. wire (AGENT_REQ_DESC-) s1_qpc_gnt;
  39.  
  40.  
  41.  
  42. g_ff #(INTERFACE = 2, DESC = AGENT_REQ_DESC- , DESC0 = LOG2($AGENT_NUMBER) ) g_ff_qpc_gnt_s1 (
  43. .ns (s0_qpc_gnt_post_tap),
  44. .ps (s1_qpc_gnt),
  45. .ns0 (s0_agent_gntid),
  46. .ps0 (s1_agent_gntid)
  47. );
  48.  
  49.  
  50.  
  51. ///////////////////////////////////////////
  52. ///////////////////s2 pipe stage return response and write new data to array
  53. //////////////////////////////////////////
  54.  
  55. wire [ $DATA_WDT -1:0] s2_qpc_old_data; // output of mem
  56.  
  57. wire (AGENT_REQ_DESC-) s2_qpc_gnt;
  58. wire [LOG2($AGENT_NUMBER)-1:0] s2_agent_gntid;
  59.  
  60.  
  61.  
  62. g_ff #(INTERFACE = 2, DESC = AGENT_REQ_DESC- , DESC0 = LOG2($AGENT_NUMBER) ) g_ff_qpc_gnt_s2 (
  63. .ns ( s1_qpc_gnt),
  64. .ps (s2_qpc_gnt),
  65. .ns0 (s1_agent_gntid),
  66. .ps0 (s2_agent_gntid)
  67. );
  68.  
  69.  
  70.  
  71.  
  72. assign IPACK(qpc_response$N.vld) = PAD($AGENT_NUMBER-1, s2_qpc_gnt.vld) << s2_agent_gntid;
  73. assign qpc_response$N.pre_request_data = s2_qpc_old_data;
  74.  
  75.  
  76. wire [$DATA_WDT-1:0] s2_qpc_new_data =
  77. {$DATA_WDT { (s2_qpc_gnt.command == COMMAND_ENUM.COMMAND_INC) }} & (s2_qpc_old_data + PAD($DATA_WDT-1,1'b1)) |
  78. {$DATA_WDT { (s2_qpc_gnt.command == COMMAND_ENUM.COMMAND_DEC) }} & (s2_qpc_old_data - PAD($DATA_WDT-1,1'b1)) |
  79. {$DATA_WDT { (s2_qpc_gnt.command == COMMAND_ENUM.COMMAND_RESET) }} & $DATA_WDT'd0 ;
  80. // TODO: which one is better?
  81. //g_mux #(CNT=3,DESC=$DATA_WDT ) g_mux_data_out (
  82. // .sel({(s2_qpc_gnt.command == s2_qpc_gnt.COMMAND_INC) , (s2_qpc_gnt.command == s2_qpc_gnt.COMMAND_DEC) , (s2_qpc_gnt.command == s2_qpc_gnt.COMMAND_RESET)} ),
  83. // .in2(s2_qpc_old_data + PAD($DATA_WDT-1,1'b1)),
  84. // .in1(s2_qpc_old_data - PAD($DATA_WDT-1,1'b1)),
  85. // .in0($DATA_WDT'd0),
  86. // .out(s2_qpc_new_data) );
  87.  
  88. ////////////////////////
  89. //// S3 - bypass sampleing
  90. ////////////////////////
  91. wire [$DATA_WDT -1:0] s3_qpc_new_data;
  92. g_ff #(DESC = $DATA_WDT ) g_ff_s3_bypass (
  93. .vld (s2_qpc_gnt.vld),
  94. .ns (s2_qpc_new_data),
  95. .ps (s3_qpc_new_data)
  96. );
  97.  
  98. //// Array + FF
  99.  
  100. // TODO: add the ff inside the SRAM
  101.  
  102. wire s0s2_bypass = ( s0_qpc_gnt.addr == s2_qpc_gnt.addr) & s2_qpc_gnt.vld;
  103. wire s1s2_bypass = ( s1_qpc_gnt.addr == s2_qpc_gnt.addr) & s2_qpc_gnt.vld;
  104.  
  105. reg s1s3_bypass;
  106. always @(posedge clk)
  107. s1s3_bypass <= #1 s0s2_bypass;
  108.  
  109. wire [$DATA_WDT-1:0] s1_qpc_old_data_pre_bypass;
  110. sram #(DESC = $DATA_WDT , ROWS = AGENT_REQ_DESC.NUM_OF_ADDRS , TYPE = RW, OUT_FF_TYPE = NO_FF) sram (
  111. .clk (clk),
  112. .write_vld ( s2_qpc_gnt.vld),
  113. .write_addr (s2_qpc_gnt.addr),
  114. .write_data ( s2_qpc_new_data),
  115. .read_vld ( s0_qpc_gnt.vld & ~ s0s2_bypass),
  116. .read_addr (s0_qpc_gnt.addr),
  117. .data_out ( s1_qpc_old_data_pre_bypass)
  118. );
  119.  
  120.  
  121. g_ff #(DESC = $DATA_WDT , IO_VLD = 0 ) g_ff_sram_bypass (
  122. .ns (
  123. s1s2_bypass ? s2_qpc_new_data :
  124. s1s3_bypass ? s3_qpc_new_data : s1_qpc_old_data_pre_bypass
  125. ),
  126. .ps(s2_qpc_old_data));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement