Subversion Repositories ngs

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. `timescale 1ns/1ns
  2.  
  3. `define CLK_PERIOD 40
  4.  
  5. module tb;
  6.  
  7.         reg rst_n;
  8.         reg clk;
  9.  
  10.  
  11.         initial
  12.         begin
  13.                 clk = 1'b0;
  14.  
  15.                 forever
  16.                         #(`CLK_PERIOD/2) clk <= ~clk;
  17.         end
  18.  
  19.         initial
  20.         begin
  21.                 rst_n = 1'b0;
  22.  
  23.                 repeat(3) @(posedge clk);
  24.  
  25.                 rst_n <= 1'b1;
  26.         end
  27.  
  28.  
  29.  
  30.  
  31.  
  32.         reg  [3:0] pre_reqs;
  33.         reg  [3:0] reqs;
  34.         reg  [3:0] prev;
  35.         wire [3:0] next;
  36.         reg  [3:0] ref_next;
  37.  
  38.         reg [3:0] was_prev,was_reqs,was_next;
  39.  
  40.         initial
  41.         begin : test_rr_arbiter
  42.  
  43.                 prev = 4'b0001;
  44.                 reqs = 4'b0001;
  45.  
  46.                 repeat(1000000)
  47.                 begin
  48.                         @(posedge clk);
  49.                         //pre_reqs = 4'd0;
  50.                         //while( !pre_reqs )
  51.                                 pre_reqs = $random>>28;
  52.  
  53.                         reqs <= pre_reqs;
  54.  
  55.                 end
  56.                 @(posedge clk);
  57.  
  58.                 $stop ;
  59.         end
  60.  
  61.         always @(posedge clk)
  62.         begin
  63.                 prev <= next;
  64.                 was_prev <= prev;
  65.                 was_reqs <= reqs;
  66.                 was_next <= next;
  67.                 #1; // allow for nonblocking assignment to take place
  68.  
  69.                 arbiter_predict(was_reqs,was_prev,ref_next);
  70.                 if( ref_next != was_next )
  71.                 begin
  72.                         $display("unequal! prev=%4b, reqs=%4b: reference_next=%4b, next=%4b\n",was_prev,was_reqs,ref_next,was_next);
  73.                 end
  74.         end
  75.  
  76.  
  77.  
  78.         task arbiter_predict;
  79.                 input  [3:0] reqs;
  80.                 input  [3:0] prev;
  81.                 output [3:0] next;
  82.                 integer i,j,k;
  83.                 begin : disable_me
  84.                         if( !reqs )
  85.                         begin
  86.                                 next = 4'd0;
  87.                         end
  88.                         else if( prev )
  89.                         begin
  90.                                 i=0;
  91.                                 while( !prev[i] )
  92.                                         i=i+1;
  93.  
  94.                                 i=(i+1)&2'b11;
  95.                                 while( !reqs[i] )
  96.                                 begin
  97.                                         i=(i+1)&2'b11;
  98.                                 end
  99.  
  100.                                 next = 4'd1<<i;
  101.                         end
  102.                         else // !prev
  103.                         begin
  104.                                 i=0;
  105.                                 while( !reqs[i] )
  106.                                         i=i+1;
  107.  
  108.                                 next = 4'd1<<i;
  109.                         end
  110.                 end
  111.         endtask
  112.  
  113.         rr_arbiter arbiter( .reqs(reqs),
  114.                             .prev(prev),
  115.                             .next(next)
  116.                           );
  117.  
  118.  
  119.  
  120. endmodule
  121.