Перейти к содержанию
    

Как тестировать FSM SystemVerilog?

Всем привет.

При изучении SystemVerilog написал простой FSM на 4 состояния, как в тестовом задании из книги Д. Томас "Логическое проектирование на SystemVerilog". Но нет понимания как автоматизировать тестирование. Я понимаю, что правильный вариант проверить все возможные переходы между состояниями. Но таких переходов может быть очень много в случае сложного автомата и задавать все переходы вручную не представляется возможным. Как это делается?

 

1.JPG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, Caruso said:

Я понимаю, что правильный вариант проверить все возможные переходы между состояниями. Но таких переходов может быть очень много в случае сложного автомата и задавать все переходы вручную не представляется возможным. 

а вам нужно именно сам FSM проверить или функциональность FSM в составе системы и подтвердить покрытием что тесты вызывали проход по всем состояниям?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, des00 said:

а вам нужно именно сам FSM проверить или функциональность FSM в составе системы

А какая разница.

Вообще у меня есть модуль верхнего уровня с именем top. В него входят сам FSM с именем FSMprobe и testbench с именем FSMprobe_tb. Вот схема:

 

Spoiler

`timescale 1ns / 1ps
 

typedef enum logic [1:0] {A = 2'b00, B = 2'b01, C = 2'b10, D = 2'b11} state_t;


localparam logic [1:0] atb = 2'b1x;
localparam logic [1:0] btc = 2'bx1;
localparam logic [1:0] ctd = 2'b00;
localparam logic [1:0] dta = 2'b00;
localparam logic [1:0] btd = 2'bx0;
localparam logic [1:0] ctb = 2'b1x;
localparam logic [1:0] dtc = 2'b01;
localparam logic [1:0] ata = 2'b0x;
localparam logic [1:0] ctc = 2'b01;
localparam logic [1:0] dtd = 2'b1x;

 

 

 

module FSMprob(
  input logic clk,
  input logic rstN, i, j,
  output logic x,y
);  

  state_t state;

  always_ff @(negedge rstN, posedge clk) begin
    if(~rstN) state <= A;
    else unique case (state)
      A: begin
        state <= (~i) ? A : B;
        {x,y} <= {1'b1,i};        
      end
      B: begin
        state <= (~j)? D : C;
        {x,y} <= {~j,j};
      end
      C: begin
        state <= B;
        if (~i & ~j) state <= D;
        if (~i & j) state <= C;
        {x,y} <= {~i, ~i & ~j};
      end     
      D: begin
        state <= D;
        if (~i & ~j) state <= A;
        if (~i & j) state <= C;
        {x,y} <= {~i & j, 1'b0};
      end     
    endcase
  end
endmodule : FSMprob

 

 

 

module FSMprob_tb(
  input logic clk,
  output logic i, j
  );
 
  logic [1:0] inp;
  assign {i,j} = inp;
 
  initial begin
    inp <= ata; @(posedge clk);
    inp <= ata; @(posedge clk);
    inp <= ata; @(posedge clk);
    inp <= atb; @(posedge clk);
    inp <= btc; @(posedge clk);
    inp <= ctc; @(posedge clk);
    inp <= ctc; @(posedge clk);
    inp <= ctc; @(posedge clk);
    inp <= ctb; @(posedge clk);
    inp <= btc; @(posedge clk);
    inp <= ctd; @(posedge clk);
    inp <= dtd; @(posedge clk);
    inp <= dtd; @(posedge clk);

    

end

endmodule : FSMprob_tb

 

 

 

module top();
  bit clk, rstN;
  logic i, j;
  logic x,y;
  //state_t state;
 
  FSMprob dut(.*);
  FSMprob_tb dut_tb(.*);

  initial begin
    //$monitor($time, " | state = %s, xy = %b", dut.state.name, {x,y});
    rstN <= #7 1;
    repeat(100) begin
      #5 clk = 0;
      #5 clk = 1;
      $display($time, " | state = %s, xy = %b", dut.state.name, {x,y});
      end
    
    #1 $finish;
  end

endmodule : top

 

 

Изменено пользователем Caruso

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, Caruso said:

А какая разница.

разница огромная. Если вам надо проверить сам FSM, тогда значит собираете второй "эталонный" FSM и каждый шаг сравниваете их друг с другом. А если функциональность, ну например FSM модуля UART, то собираете тест, который шлет байтики туда и обратно, с разными уровнями ошибок и проверяете что все работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, des00 said:

разница огромная. Если вам надо проверить сам FSM, тогда значит собираете второй "эталонный" FSM и каждый шаг сравниваете их друг с другом. А если функциональность, ну например FSM модуля UART, то собираете тест, который шлет байтики туда и обратно, с разными уровнями ошибок и проверяете что все работает.

Здорово!

И сразу вопрос про "эталонный" FSM. Реализация его должна быть какой-то отличной от проверяемого FSM? А что если в нем тоже ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, Caruso said:

И сразу вопрос про "эталонный" FSM. Реализация его должна быть какой-то отличной от проверяемого FSM?

желательно да, написана в другом стиле, языке, виде (таблично например). Как вариант есть RTL FSM и behaviour FSM

22 minutes ago, Caruso said:

А что если в нем тоже ошибка?

вот поэтому в крупных командах тестер и разработчик разные люди.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 minutes ago, des00 said:

вот поэтому в крупных командах тестер и разработчик разные люди.

Вот поэтому вам спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30.03.2022 в 09:52, Caruso сказал:

Но таких переходов может быть очень много в случае сложного автомата и задавать все переходы вручную не представляется возможным. Как это делается?

Вообще, если подумать, то в автомате тестировать нужно только комбинационную часть, регистр состояний тестировать незачем, он слишком прост для этого.

Потому можно сделать так: переписываем автомат так чтобы его комбинационная часть была в отдельном always-блоке. Этот always-блок временно, на время тестирования, помещаем в отдельный модуль. На вход модуля помещаем счётчик, который, во время счёта, переберёт все возможные комбинации на входе модуля. Ну а далее просто смотрим что выдаёт модуль и сравниваем с графом автомата.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...