Caruso 0 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба Всем привет. При изучении SystemVerilog написал простой FSM на 4 состояния, как в тестовом задании из книги Д. Томас "Логическое проектирование на SystemVerilog". Но нет понимания как автоматизировать тестирование. Я понимаю, что правильный вариант проверить все возможные переходы между состояниями. Но таких переходов может быть очень много в случае сложного автомата и задавать все переходы вручную не представляется возможным. Как это делается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 13 minutes ago, Caruso said: Я понимаю, что правильный вариант проверить все возможные переходы между состояниями. Но таких переходов может быть очень много в случае сложного автомата и задавать все переходы вручную не представляется возможным. а вам нужно именно сам FSM проверить или функциональность FSM в составе системы и подтвердить покрытием что тесты вызывали проход по всем состояниям? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Caruso 0 30 марта, 2022 Опубликовано 30 марта, 2022 (изменено) · Жалоба 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 Изменено 30 марта, 2022 пользователем Caruso Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 17 minutes ago, Caruso said: А какая разница. разница огромная. Если вам надо проверить сам FSM, тогда значит собираете второй "эталонный" FSM и каждый шаг сравниваете их друг с другом. А если функциональность, ну например FSM модуля UART, то собираете тест, который шлет байтики туда и обратно, с разными уровнями ошибок и проверяете что все работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Caruso 0 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 14 minutes ago, des00 said: разница огромная. Если вам надо проверить сам FSM, тогда значит собираете второй "эталонный" FSM и каждый шаг сравниваете их друг с другом. А если функциональность, ну например FSM модуля UART, то собираете тест, который шлет байтики туда и обратно, с разными уровнями ошибок и проверяете что все работает. Здорово! И сразу вопрос про "эталонный" FSM. Реализация его должна быть какой-то отличной от проверяемого FSM? А что если в нем тоже ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 21 minutes ago, Caruso said: И сразу вопрос про "эталонный" FSM. Реализация его должна быть какой-то отличной от проверяемого FSM? желательно да, написана в другом стиле, языке, виде (таблично например). Как вариант есть RTL FSM и behaviour FSM 22 minutes ago, Caruso said: А что если в нем тоже ошибка? вот поэтому в крупных командах тестер и разработчик разные люди. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Caruso 0 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 35 minutes ago, des00 said: вот поэтому в крупных командах тестер и разработчик разные люди. Вот поэтому вам спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 30.03.2022 в 09:52, Caruso сказал: Но таких переходов может быть очень много в случае сложного автомата и задавать все переходы вручную не представляется возможным. Как это делается? Вообще, если подумать, то в автомате тестировать нужно только комбинационную часть, регистр состояний тестировать незачем, он слишком прост для этого. Потому можно сделать так: переписываем автомат так чтобы его комбинационная часть была в отдельном always-блоке. Этот always-блок временно, на время тестирования, помещаем в отдельный модуль. На вход модуля помещаем счётчик, который, во время счёта, переберёт все возможные комбинации на входе модуля. Ну а далее просто смотрим что выдаёт модуль и сравниваем с графом автомата. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться