kenezoer 0 December 10, 2022 Posted December 10, 2022 · Report post Цитата Есть целая профессия для этого. Верификация. Верификаторы с изумлением смотрят на то, что разглядывание вейвформ считается тестом, и с неподдельным интересуются, умеет ли смотрящий на картинки читать. Интересное мнение, конечно, жаль, оно не применимо к RTL дев, разве что RTL вериф и то, при условии, что у тебя уже есть нормально описанное окружение с правильно ведущим себя интерфейсом к DUT'у. Если кто-то сможет написать полностью AXI4 Compliant хотя бы адресную карту без разглядывания вейвформ - я бы на это дело посмотрел) Quote Share this post Link to post Share on other sites More sharing options...
one_eight_seven 0 December 10, 2022 Posted December 10, 2022 · Report post 5 hours ago, kenezoer said: Интересное мнение, конечно, жаль, оно не применимо к RTL дев, разве что RTL вериф и то, при условии, что у тебя уже есть нормально описанное окружение с правильно ведущим себя интерфейсом к DUT'у. Если кто-то сможет написать полностью AXI4 Compliant хотя бы адресную карту без разглядывания вейвформ - я бы на это дело посмотрел) Какое отношение этот бред имеет к тестированию и к изначальному вопросу? Про отладку никто не спрашивал. Quote Share this post Link to post Share on other sites More sharing options...
Zversky 9 December 19, 2022 Posted December 19, 2022 · Report post В 24.11.2022 в 11:44, Вадим Н. сказал: Testbench, вот сейчас рисую. Ты что-то затих. Как и всех снегом занесло? ) В 24.11.2022 в 11:44, Вадим Н. сказал: Он выглядит более структурировано чем предидущие. Нарисовал - показывай ) Я же тебе свои прислал, ЕМНИП? И не только тестбенчи. Или, глядя на мои, наоборот, застеснялся ? А считай, что ничего и не было: и, вообще, тут нечего стесняться. Все свои, и друг друга учат. В 24.11.2022 в 11:44, Вадим Н. сказал: И главное, в нём прописано, что собственно хотелось бы проверить на каждом этапе. Тем более показывай: что там такого интересного есть. И, вообще, звони голосом (в любое, удобное тебе, время (даже с учётом разницы по времени)): традиция добрая, и её надлежит поддерживать. Чисто по-человечески. Quote Share this post Link to post Share on other sites More sharing options...
Вадим Н. 0 December 22, 2022 Posted December 22, 2022 · Report post On 12/19/2022 at 6:28 PM, Zversky said: Ты что-то затих. - переключался на другие задачи. Вот, можно сказать, вернулся к теме ПЛИС. Не уверен что мы общались в личке или я скачивал ваши примеры. В любом случае Спасибо ) to all Закину прямо сюда testbench как он был сделан (на момент прыжка в сторону) Spoiler `timescale 1ns / 1ns /* fb_detect_adder module testbench */ module testbench(); reg clk; initial clk = 1; always #5 clk = !clk; event TB_DONE; initial @ TB_DONE $stop; parameter N_ADC = 4; parameter N_SAMPLES = 3; parameter [N_ADC-1:0] ADC_G = {1'b1, {N_ADC - 1 {1'b0}}}; // Greate than 0 parameter [N_ADC-1:0] ADC_L = {1'b0, {N_ADC - 1 {1'b1}}}; // Less than 0 reg areset; reg set; reg [N_ADC-1:0] adc_data; reg adc_data_valid; wire addr_t1_sgn, addr_t1_sgn_valid; wire addr_sgn; wire [N_ADC-1:0] addr_abs; wire [N_SAMPLES-1:0] addr_tot; wire [N_ADC+N_SAMPLES-1:0] addr_sum; wire addr_valid; integer i; initial begin $dumpfile("t.vcd"); $dumpvars(0, testbench); test1; test2; test3; $display("%d> все тесты завершены", $stime); #100 -> TB_DONE; end /* активация uut с определёнными входными значениями только эта подпрограмма меняет значения adc_data adc_data_valid set таким образом, это эмуляция АЦП и fb_detect_hist */ task strobe (input [N_ADC-1:0] strobe_data, input strobe_set); begin @ (posedge clk) adc_data_valid <= 0; set <= 0; @ (posedge clk) adc_data <= strobe_data; adc_data_valid <= 1; @ (posedge clk) adc_data_valid <= 0; $display("%d> adc_data_valid", $stime); @ (posedge clk) set <= strobe_set; if (strobe_set) $display("%d> reset статистики", $stime); @ (posedge clk) set <= 0; repeat (3) @ (posedge clk); end endtask /* ТЕСТ 1 начальный сброс нет сэмплов Что проверяется: сбрасываются все внутренние регистры и выходные порты и так всё и стоит пока не начнутся сэмплы */ task test1; begin $display("%d> %m", $stime); // x-state при старте repeat (10) @ (posedge clk); // пауза // сброс uut и входных сигналов areset <= 1; adc_data <= 0; adc_data_valid <= 0; set <= 0; fork begin: WRITER // состояние сброса repeat (10) @ (posedge clk); // нормальная работа uut areset <= 0; repeat (10) @ (posedge clk); $display("%d> ...OK", $stime); // тест пройден disable READER; end begin: READER @ (posedge addr_valid); disable WRITER; $display("%d> NOT OK - модуль что-то выдаёт, хотя не должен", $stime); -> TB_DONE; end join end endtask /* ТЕСТ 2 максимальное число сэмплов одного знака Что проверяется: корректное вычисление статистики; в том числе и при максимальном числе сэмплов достаточная разрядность суммы наименьших значений */ task test2; begin $display("%d> %m", $stime); fork begin: WRITER repeat (2 ** N_SAMPLES - 1) strobe (0, 0); // максимальное число сэмплов repeat (10) @ (posedge clk); // пауза $display("%d> ...OK", $stime); // тест пройден disable READER; end begin: READER i = 0; while (i < 2 ** N_SAMPLES) begin @ (posedge addr_valid); i = i + 1; if (!( addr_sgn == 0 && addr_abs == ADC_G && addr_tot == i && addr_sum == ADC_G * i )) begin disable WRITER; $display("%d> NOT OK сэмпл %d (%d,\t%d,\t%d,\t%d)", $stime, i, addr_sgn, addr_abs, addr_tot, addr_sum); -> TB_DONE; disable READER; end end @ (posedge addr_valid); disable WRITER; $display("%d> NOT OK - сюда не должны попасть", $stime); -> TB_DONE; end join end endtask /* ТЕСТ 3 максимальное число сэмплов другого знака Что проверяется: корректный ресет статистики; достаточная разрядность суммы наибольших значений */ task test3; reg all_samples_good; begin $display("%d> %m", $stime); all_samples_good = 0; fork begin: WRITER strobe (2 ** N_ADC - 1, 1); // ресет статистики на первом сэмпле repeat (2 ** N_SAMPLES - 2) strobe (2 ** N_ADC - 1, 0); // число сэмплов до максимума repeat (10) @ (posedge clk); // пауза if (all_samples_good) // тест пройден $display("%d> ...OK", $stime); else begin $display("%d> NOT OK не все сэмплы обработаны", $stime); -> TB_DONE; end disable READER; end begin: READER i = 0; while (i < 2 ** N_SAMPLES - 1) begin @ (posedge addr_valid); i = i + 1; if (!( addr_sgn == 1 && addr_abs == ADC_G && addr_tot == i && addr_sum == ADC_G * i )) begin disable WRITER; $display("%d> NOT OK сэмпл %d (%d,\t%d,\t%d,\t%d)", $stime, i, addr_sgn, addr_abs, addr_tot, addr_sum); -> TB_DONE; disable READER; end end all_samples_good = 1; @ (posedge addr_valid); disable READER; $display("%d> NOT OK - сюда не должны попасть", $stime); end join end endtask fb_detect_adder #( .N_ADC (N_ADC ), .N_SAMPLES (N_SAMPLES) ) uut ( .areset (areset ), .clk (clk ), .adc_data (adc_data ), .adc_data_valid (adc_data_valid ), .set (set ), .addr_t1_sgn (addr_t1_sgn ), .addr_t1_sgn_valid (addr_t1_sgn_valid), .addr_abs (addr_abs ), .addr_sgn (addr_sgn ), .addr_tot (addr_tot ), .addr_sum (addr_sum ), .addr_valid (addr_valid ) ); endmodule сам модуль тоже прилагаю в архиве. С оговоркой, что это дилетантизм, и проходной пример в процессе поиска решений. Вопросов по нему у меня нет. Но может кому то просто интересно. exs.7z Quote Share this post Link to post Share on other sites More sharing options...
Zversky 9 December 22, 2022 Posted December 22, 2022 · Report post 7 часов назад, Вадим Н. сказал: Не уверен что мы общались в личке или я скачивал ваши примеры. В любом случае Спасибо ) [00:03, 10.12.2022] Вадим Ш: [00:03, 10.12.2022] Вадим Ш: да, письмо пришло [00:04, 10.12.2022] Вадим Ш: А, ну это я уже делал... квеста сим как раз скачивал [00:05, 10.12.2022] Вадим Ш: ладно, завтра уже буду воевать за звание своих 🙂 а то у меня уже 4 утра :-_ -------------------------------------------------------------- Да, похоже, это я перепутал )) Но не суть: ничто не мешает заняться, если только есть желание взаимодействовать. С моей стороны желание есть безотносительно и безусловно: лишь бы на пользу. Даже хотя бы из того, что мне тут очень сильно помогают, и я считаю своим долгом ещё больше помогать остальным: добро просто обязано прирастать добром )) 7 часов назад, Вадим Н. сказал: сам модуль тоже прилагаю в архиве. Там не только модуль, но и TCL. Есть принципиальная разница чем тестировать: икарусом или, например, ментором? Если я протестирую ментором и покажу результаты: будут ли они тебе (можно на ты?) релевантны? Можешь (по моим стопам (расскажу и покажу всё) поставить ментов (квесту) и повторить то, что сделаю я? Quote Share this post Link to post Share on other sites More sharing options...