Advertisement
JadonChan

digital_lock_tb.sv

May 30th, 2024
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns/1ns
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 05/30/2024 02:37:20 PM
  7. // Design Name:
  8. // Module Name: digital_lock_tb
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21.  
  22. task automatic pulse;
  23.     ref reg clock;
  24.     begin
  25.         clock = 1'b1;
  26.         #10;
  27.         clock = 1'b0;
  28.         #10;
  29.     end
  30. endtask
  31.  
  32. task automatic set_codes;
  33.     input [3:0] codes [3:0];
  34.     ref reg [3:0] code;
  35.     ref reg clock;
  36.     ref reg mode;
  37.     integer i;
  38.     begin
  39.         mode = 1'b1;
  40.         for (i = 0; i < 4; i = i + 1) begin
  41.             code = codes[i];
  42.             pulse(clock);
  43.         end
  44.     end
  45. endtask
  46.  
  47. task automatic verify_codes(
  48.         input [3:0] codes [3:0],
  49.         ref reg [3:0] code,
  50.         ref logic clock,
  51.         ref reg mode
  52.     );
  53.  
  54.     integer i;
  55.     begin
  56.         mode = 1'b0;
  57.         for (i = 0; i < 4; i = i + 1) begin
  58.             code = codes[i];
  59.             pulse(clock);
  60.         end
  61.     end
  62. endtask
  63.  
  64. module digital_lock_tb();
  65.     reg clock;
  66.     reg reset;
  67.     reg [3:0] code;
  68.     reg mode;
  69.     wire unlock;
  70.     wire error;
  71.  
  72.     initial begin
  73.         // Initialize signals
  74.         clock = 1'b0;
  75.         reset = 1'b1;
  76.         code = 4'b0000;
  77.         mode = 1'b0;
  78.  
  79.         reset = 1'b0;
  80.         #10;
  81.         pulse(reset);
  82.        
  83.         // Verify sudo codes
  84.         verify_codes({4'b0000, 4'b0000, 4'b0000, 4'b0000}, code, clock, mode);
  85.  
  86.         // Set codes
  87.         set_codes({4'b0001, 4'b0010, 4'b0011, 4'b0100}, code, clock, mode);
  88.  
  89.         // One error
  90.         verify_codes({4'b1010, 4'b1011, 4'b1100, 4'b1101}, code, clock, mode);
  91.        
  92.         // Verify user codes
  93.         verify_codes({4'b0001, 4'b0010, 4'b0011, 4'b0100}, code, clock, mode);
  94.  
  95.         // Three error in a row
  96.         verify_codes({4'b1010, 4'b1011, 4'b1100, 4'b1101}, code, clock, mode);
  97.         verify_codes({4'b1010, 4'b1011, 4'b1100, 4'b1101}, code, clock, mode);
  98.         verify_codes({4'b1010, 4'b1011, 4'b1100, 4'b1101}, code, clock, mode);
  99.  
  100.         // Test if user codes work
  101.         verify_codes({4'b0001, 4'b0010, 4'b0011, 4'b0100}, code, clock, mode);
  102.  
  103.         // Reset when dead
  104.         pulse(reset);
  105.  
  106.         // Test after reset
  107.         verify_codes({4'b0001, 4'b0010, 4'b0011, 4'b0100}, code, clock, mode);
  108.  
  109.         // Test if sudo codes work
  110.         verify_codes({4'b0000, 4'b0000, 4'b0000, 4'b0000}, code, clock, mode);
  111.        
  112.         // Finish simulation
  113.         #100;
  114.         $finish;
  115.     end
  116.  
  117.     digital_lock uut(
  118.         .clock(clock),
  119.         .reset(reset),
  120.         .code(code),
  121.         .mode(mode),
  122.         .unlock(unlock),
  123.         .error(error)
  124.     );
  125.  
  126. endmodule
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement