Advertisement
petrdynin

Untitled

Dec 5th, 2023 (edited)
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module testbench;
  2.  
  3.     // Тактовый сигнал и сигнал сброса
  4.     logic clk;
  5.     logic aresetn;
  6.  
  7.     // Остальные сигналы
  8.     logic [31:0] instr;
  9.     logic [31:0] i_imm;
  10.     logic [31:0] s_imm;
  11.     logic [31:0] b_imm;
  12.     logic [31:0] u_imm;
  13.     logic [31:0] j_imm;
  14.  
  15.     riscv_imm_gen DUT (
  16.         .clk     ( clk     ),
  17.         .aresetn ( aresetn ),
  18.         .instr   ( instr   ),
  19.         .i_imm   ( i_imm   ),
  20.         .s_imm   ( s_imm   ),
  21.         .b_imm   ( b_imm   ),
  22.         .u_imm   ( u_imm   ),
  23.         .j_imm   ( j_imm   )
  24.     );
  25.  
  26.     // TODO:
  27.     // Определите период тактового сигнала
  28.     parameter CLK_PERIOD = 10;// ?;
  29.  
  30.     // TODO:
  31.     // Cгенерируйте тактовый сигнал
  32.     initial begin
  33.         clk <= 0;
  34.         forever begin
  35.             #(CLK_PERIOD/2) clk <= ~clk;
  36.         end
  37.        
  38.     end
  39.    
  40.     // Генерация сигнала сброса
  41.     initial begin
  42.         aresetn <= 0;
  43.         #(CLK_PERIOD);
  44.         aresetn <= 1;
  45.     end
  46.  
  47.     // TODO:
  48.     // Сгенерируйте входные сигналы
  49.     // Не забудьте про ожидание сигнала сброса!
  50.    
  51.     initial begin
  52.         wait(aresetn);
  53.         forever begin
  54.             @(posedge clk);
  55.             instr <= $urandom_range(32'hFFFFFFFF,32'h80);
  56.          end
  57.         @(posedge clk);
  58.         $stop();
  59.     end
  60.  
  61.     // Пользуйтесь этой структурой
  62.     typedef struct {
  63.         logic [31:0] instr;
  64.         logic [31:0] i_imm;
  65.         logic [31:0] s_imm;
  66.         logic [31:0] b_imm;
  67.         logic [31:0] u_imm;
  68.         logic [31:0] j_imm;
  69.     } packet;
  70.  
  71.     mailbox#(packet) mon2chk = new();
  72.  
  73.     // TODO:
  74.     // Сохраняйте сигналы каждый положительный
  75.     // фронт тактового сигнала
  76.     initial begin
  77.         packet pkt;
  78.         wait(aresetn);
  79.         forever begin
  80.             @(posedge clk);
  81.             // Пишите здесь.
  82.             pkt.instr = instr;
  83.             pkt.i_imm = i_imm;
  84.             pkt.s_imm = s_imm;
  85.             pkt.b_imm = b_imm;
  86.             pkt.u_imm = u_imm;
  87.             pkt.j_imm = j_imm;
  88.             mon2chk.put(pkt);
  89.         end
  90.     end
  91.  
  92.     // TODO:
  93.     // Выполните проверку выходных сигналов.
  94.     initial begin
  95.         packet pkt_prev, pkt_cur;
  96.        
  97.         wait(aresetn);
  98.         mon2chk.get(pkt_prev);
  99.         forever begin
  100.             mon2chk.get(pkt_cur);
  101.             // Пишите здесь.
  102.             if(pkt_cur.i_imm !== {{( 21 ){ pkt_prev.instr[31] } }, pkt_prev.instr[30:20] })
  103.                  $error("BAD I_imm");
  104.             if(pkt_cur.s_imm !== {{( 21 ){ pkt_prev.instr[31] } }, pkt_prev.instr[30:25], pkt_prev.instr[11:8], pkt_prev.instr[7]})
  105.                 $error("BAD S_imm");
  106.             if(pkt_cur.b_imm !== {{( 20 ){ pkt_prev.instr[31] } }, pkt_prev.instr[7], pkt_prev.instr[30:25], pkt_prev.instr[11:8], 1'b0})
  107.                 $error("BAD B_imm");
  108.             if(pkt_cur.u_imm !== {pkt_prev.instr[31], pkt_prev.instr[30:20], pkt_prev.instr[19:12], {(12){1'b0 }}})
  109.                 $error("BAD U_imm");
  110.             if(pkt_cur.j_imm !== {{(12){pkt_prev.instr[31]}}, pkt_prev.instr[19:12], pkt_prev.instr[20], pkt_prev.instr[30:25], pkt_prev.instr[24:21], 1'b0 })
  111.                 $error("BAD J_imm");
  112.             pkt_prev = pkt_cur;
  113.          end
  114.     end
  115.  
  116. endmodule
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement