Advertisement
Guest User

xynta

a guest
Feb 20th, 2020
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2.  
  3. interface xynta_if #(
  4.     COUNTER_WIDTH=8
  5. ) (
  6.     input logic clk,
  7.     input logic resetn
  8. );
  9.     logic ready;
  10.     logic valid;
  11.     logic [COUNTER_WIDTH-1:0] data;
  12. endinterface
  13.  
  14. class xynta_driver #(
  15.     parameter COUNTER_WIDTH=8
  16. );
  17.     integer xynta_counter;
  18.     rand bit xynta_valid;
  19.     virtual xynta_if drv_to_dut;
  20.    
  21.     function new (virtual xynta_if drv_to_dut);
  22.         this.drv_to_dut = drv_to_dut;
  23.     endfunction
  24.    
  25.     task drive_valid;
  26.         forever begin
  27.             this.randomize();
  28.             this.drv_to_dut.valid <= this.xynta_valid;
  29.             @(posedge this.drv_to_dut.clk);  
  30.         end
  31.     endtask
  32.    
  33.     task drive_data;
  34.         this.xynta_counter = 0;
  35.         forever begin
  36.             this.drv_to_dut.data <= this.xynta_counter;
  37.             this.xynta_counter++;
  38.            
  39.             // DOESN'T WORK
  40.             @(posedge this.drv_to_dut.clk iff
  41.                 (   this.drv_to_dut.ready &&
  42.                     this.drv_to_dut.valid )     );
  43.                    
  44. //            // hack
  45. //            @(negedge this.drv_to_dut.clk iff
  46. //                (   this.drv_to_dut.ready &&
  47. //                    this.drv_to_dut.valid )     );
  48. //            @(posedge this.drv_to_dut.clk );
  49.         end
  50.     endtask
  51.    
  52.     task main;
  53.         fork
  54.             drive_valid();
  55.             drive_data();
  56.         join_any
  57.     endtask
  58.    
  59. endclass
  60.  
  61. class xynta_test_environment #(
  62.     parameter COUNTER_WIDTH=8
  63. );
  64.     virtual xynta_if drv_to_dut;
  65.     xynta_driver #(COUNTER_WIDTH) driver;
  66.    
  67.     function new (virtual xynta_if drv_to_dut);
  68.         this.drv_to_dut = drv_to_dut;
  69.         this.driver = new(drv_to_dut);
  70.     endfunction
  71.    
  72.     task run;
  73.         this.driver.main();
  74.     endtask
  75. endclass
  76.  
  77. program xynta_test(xynta_if drv_to_dut);
  78.     xynta_test_environment env;
  79.    
  80.     initial begin
  81.         env = new(drv_to_dut);
  82.         env.run();
  83.     end
  84. endprogram
  85.  
  86. module xynta #(
  87.     COUNTER_WIDTH=8
  88. ) (
  89.     input wire clk,
  90.     input wire resetn,
  91.     // slave if
  92.     input wire [COUNTER_WIDTH-1:0] s_data,
  93.     input wire s_valid,
  94.     output wire s_ready,
  95.     // master if
  96.     output wire [COUNTER_WIDTH-1:0] m_data,
  97.     output wire m_valid,
  98.     input wire m_ready
  99. );
  100.     assign m_data = s_data;
  101.     assign m_valid = s_valid;
  102.     assign s_ready = m_ready;
  103. endmodule
  104.  
  105. module xynta_tb(
  106. );
  107.     localparam COUNTER_WIDTH = 8;
  108.     reg clk;
  109.     reg resetn;
  110.     reg ready;
  111.     wire [COUNTER_WIDTH-1:0] data;
  112.     wire valid;
  113.    
  114.     xynta_if drv_to_dut(clk, resetn);
  115.     xynta_test test_inst(drv_to_dut);
  116.    
  117.     xynta #(COUNTER_WIDTH) xynta_dut (
  118.         .clk(clk),
  119.         .resetn(resetn),
  120.         .s_data(drv_to_dut.data),
  121.         .s_valid(drv_to_dut.valid),
  122.         .s_ready(drv_to_dut.ready),
  123.         .m_data(data),
  124.         .m_valid(valid),
  125.         .m_ready(ready)
  126.     );
  127.    
  128.     initial begin
  129.         clk = 1;
  130.         forever #5 clk = !clk;
  131.     end
  132.    
  133.     initial begin
  134.             resetn = 1;
  135.             ready = 0;
  136.         #10 resetn <= 0;
  137.         #10 resetn <= 1;
  138.         #10;
  139.         forever begin
  140.             ready <= $random % 3 != 0;
  141.             // hack
  142.             //ready <= #1 $random % 3 != 0;
  143.             @(posedge clk);
  144.         end
  145.     end
  146. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement