AnatolySh 0 17 мая, 2022 Опубликовано 17 мая, 2022 · Жалоба Всем добра! Есть модуль, пропускающий через себя импульсы с длительностью больше определённой. Задача: написать testbench, подающий на вход модуля последовательно импульсы с нарастающей от единичной длительностью и проверяющий появление оных на выходе, дабы понять границу. Какие варианты существуют (SV tasks, SVA)? В общем, ткните носом, плиз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 2 17 мая, 2022 Опубликовано 17 мая, 2022 · Жалоба 21 minutes ago, AnatolySh said: Задача: написать testbench, подающий на вход модуля последовательно импульсы с нарастающей от единичной длительностью и проверяющий появление оных на выходе, дабы понять границу. Я бы примерно так сделал: initial begin @posedge(clk); for (int i = 0; i < MAX_LEN; i++) begin a = 1'b1; repeat(i)@posedge(clk); a = 1'b0; repeat(8)@posedge(clk); end end initial begin forever @negedge(a_out) begin cnt_pulse = 0; $display("Pulse size %d", cnt_pulse); end end initial begin forever @posedge(clk) begin if (a_out) begin cnt_pulse = cnt_pulse + 1'b1; end end И последняя выведенная в консоль чиселка и будет "границей". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 17 мая, 2022 Опубликовано 17 мая, 2022 · Жалоба А я бы не привязвал к тактовой частоте. Просто следал бы на контроле зарежки и рандомизации длины этой задержки. Отдельно бы сделал случай предельного размера импульса, и отдельно же - случай синхронизации с тактовым сигналом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolySh 0 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба 7 hours ago, nice_vladi said: Я бы примерно так сделал: Спасибо огромное, сделал так: `timescale 1ns / 1ns `define T1ns 1 // with respect to timeunit `define T1us ( 1000 * `T1ns ) `define T1ms ( 1000 * `T1us ) `define CLK_PRD ( 20 * `T1ns ) `define CNT_PULSE_DIM 8 `define CNT_PULSE_RNG [`CNT_PULSE_DIM - 1 : 0] `define MAX_DELAY `CNT_PULSE_DIM'd20 `define PAUSE_DELAY 10 module adc_shum_zashita_tb; logic clk; logic a; logic a_out; adc_shum_zashita adc_shum_zashita_inst ( .clk ( clk ), .a ( a ), .a_out ( a_out ) ); logic `CNT_PULSE_RNG cnt_pulse; initial begin clk = 1'b0; forever # ( `CLK_PRD / 2 ) clk = ~clk; end logic `CNT_PULSE_RNG i; initial begin @(posedge clk); for (i = 0; i < `MAX_DELAY; i++) begin a = 1'b1; repeat(i) @(posedge clk); a = 1'b0; repeat(`PAUSE_DELAY) @(posedge clk); end end initial begin forever @(negedge a_out) begin cnt_pulse = 0; $display("Pulse size (decimal) = %0d", i); end end initial forever @(posedge clk) cnt_pulse = a_out ? cnt_pulse + 1'b1 : cnt_pulse; endmodule : adc_shum_zashita_tb Что выдало в консоль # Pulse size (decimal) = x # Pulse size (decimal) = 8 # Pulse size (decimal) = 9 # Pulse size (decimal) = 10 # Pulse size (decimal) = 11 # Pulse size (decimal) = 12 # Pulse size (decimal) = 13 И отобразило Более чем доволен. 6 hours ago, one_eight_seven said: А я бы не привязвал к тактовой частоте. Прошу простить, не упомянул в ТЗ частоту. Она там была, конечно что.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба ИМХО, за константы на макросах, в 21ом веке, надо отрубать руки, по самую голову. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolySh 0 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба Прошу сказать, что не так с макросами и пнуть, как понимаю, в сторону параметров? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба 4 hours ago, AnatolySh said: Прошу сказать, что не так с макросами и пнуть, как понимаю, в сторону параметров? обсуждалось на форуме несколько раз. Макрос это просто текстовая подстановка, ни контроля типов, ни контроля значений, легко отменить, легко переопределить, гуляют по всему проекту, независимо от области видимости. Да, штука полезная, да используется в куче кодов-примеров где задаются константы, но это примеры лохматых годов, от авторов любителей копипаста. Для констант есть глобальные параметры, локальные параметры, пакеты, с контролем типов и всего прочего Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolySh 0 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба Спасибо. Форум читаю нерегулярно, особенно сейчас, когда как и у вас работы выросло вдвое, но теперь сориентируюсь на переход к параметрам. Пакеты, как понимаю, это про VHDL? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба 4 минуты назад, AnatolySh сказал: Пакеты, как понимаю, это про VHDL? Говорят, в SV завезли пакеты. Ждём, когда нормальные функции появятся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 2 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба 5 hours ago, AnatolySh said: Прошу сказать, что не так с макросами и пнуть, как понимаю, в сторону параметров? Кстати, временные задержки можно писать напрямую #1us, #22ms, #33ns. А это, конечно, страшно)) `define CNT_PULSE_RNG [`CNT_PULSE_DIM - 1 : 0] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба 59 minutes ago, andrew_b said: Говорят, в SV завезли пакеты. Они там с самого начала 59 minutes ago, andrew_b said: Ждём, когда нормальные функции появятся. Они и так нормальные. 6 hours ago, AnatolySh said: Прошу простить, не упомянул в ТЗ частоту. Она там была, конечно что.. т.е. импульсы - это событие строго синхронное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 мая, 2022 Опубликовано 18 мая, 2022 · Жалоба 7 minutes ago, one_eight_seven said: Они и так нормальные. не совсем. в VHDL есть unbonded аргументы функций. В SV только фиксированной разрядности. Но, в SV есть шаблоны функций на классах (для моделирования) или на интерфейсах (для синтеза). Отсутствие синтеза функций статических классов, это большое упущение ИМХО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolySh 0 20 мая, 2022 Опубликовано 20 мая, 2022 · Жалоба On 5/18/2022 at 12:44 PM, des00 said: обсуждалось на форуме несколько раз. Какие параметры поиска задать, чтобы получить наиболее релевантные результаты? Ну или готов прошерстить форум (этот раздел, или искать и в трёх оставшихся "дружественных"?), дабы покончить, наконец-то с наследием прошлого, не достойного звания советского офицера. On 5/18/2022 at 1:46 PM, nice_vladi said: временные задержки можно писать напрямую Где считаю нужным, писю, и уже давно On 5/18/2022 at 1:46 PM, nice_vladi said: А это, конечно, страшно)) Всё, я уже обильно посыпал голову пеплом и готов быть посланным в нужном направлении ))) On 5/18/2022 at 1:53 PM, one_eight_seven said: т.е. импульсы - это событие строго синхронное? Это - выход SPI ADC AD7680, управляемого (CS и CLK) от ПЛИС через LVDS TX -> LVDS RX -> OptoCouple ADuM640X, данные с которого по той же цепочке улетают обратно. Кто и как решил, что эти данные надо фильтровать и почему именно такую границу заложил - предстоит либо выяснить либо забить на это дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolySh 0 25 мая, 2022 Опубликовано 25 мая, 2022 · Жалоба И снова здравствуйте. Пока родил вот что: package adc_shum_zashita_pkg; timeunit 100ps; timeprecision 100ps; parameter CLK_PRD = 8ns; // 125MHz parameter RST_SET_TIME = 20ns; parameter RST_DUR_TIME = 10ns; parameter CNT_PULSE_DIM = 8; typedef logic [CNT_PULSE_DIM - 1 : 0] cnt_pulse_t; parameter MAX_DELAY = 20; parameter PAUSE_DELAY = 20; endpackage : adc_shum_zashita_pkg и import adc_shum_zashita_pkg::*; module adc_shum_zashita_tb; logic clk; logic rst; logic a; logic a_out; initial $display("Started adc_shum_zashita_tb.sv"); adc_shum_zashita adc_shum_zashita_inst (.*); initial begin clk = 1'b0; forever # ( CLK_PRD / 2 ) clk = ~clk; end cnt_pulse_t i; initial begin @(posedge clk); for (i = 0; i < MAX_DELAY; i++) begin a = 1'b1; repeat(i) @(posedge clk); a = 1'b0; repeat(PAUSE_DELAY) @(posedge clk); end end initial begin rst = 0; #RST_SET_TIME rst = 1; #RST_DUR_TIME rst = 0; end endmodule : adc_shum_zashita_tb думаю в сторону рандомизации, хотя не уверен, что она здесь нужна Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 26 мая, 2022 Опубликовано 26 мая, 2022 · Жалоба 8 часов назад, AnatolySh сказал: adc_shum_zashita Транслит смотрится плохо. Всегда. 8 часов назад, AnatolySh сказал: (.*) Это обфускация кода. Тому, это принял в стандарт, надо отрубить головы. Тому, кот это использует, руки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться