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

Testbench, формирующий импульсы с нарастающей длительностью

Всем добра!

Есть модуль, пропускающий через себя импульсы с длительностью больше определённой.

Задача: написать testbench, подающий на вход модуля последовательно импульсы с нарастающей от единичной длительностью и проверяющий появление оных на выходе, дабы понять границу.

Какие варианты существуют (SV tasks, SVA)? В общем, ткните носом, плиз.

image.thumb.png.5bb237479f50115c1153309374eb5148.png

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


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

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

И последняя выведенная в консоль чиселка и будет "границей".

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


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

А я бы не привязвал к тактовой частоте. Просто следал бы на контроле зарежки и рандомизации длины этой задержки. Отдельно бы сделал случай предельного размера импульса, и отдельно же - случай синхронизации с тактовым сигналом.

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


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

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

И отобразило

image.thumb.png.be028ba184725f322a9a3b306bed7325.png

Более чем доволен.

6 hours ago, one_eight_seven said:

А я бы не привязвал к тактовой частоте.

Прошу простить, не упомянул в ТЗ частоту. Она там была, конечно что..

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


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

ИМХО, за константы на макросах, в 21ом веке, надо отрубать руки, по самую голову.

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


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

Прошу сказать, что не так с макросами и пнуть, как понимаю, в сторону параметров? 

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


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

4 hours ago, AnatolySh said:

Прошу сказать, что не так с макросами и пнуть, как понимаю, в сторону параметров? 

обсуждалось на форуме несколько раз. Макрос это просто текстовая подстановка, ни контроля типов, ни контроля значений, легко отменить, легко переопределить, гуляют по всему проекту, независимо от области видимости. Да, штука полезная, да используется в куче кодов-примеров где задаются константы,  но это примеры лохматых годов, от авторов любителей копипаста. Для констант есть глобальные параметры, локальные параметры, пакеты, с контролем типов и всего прочего

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


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

Спасибо. Форум читаю нерегулярно, особенно сейчас, когда как и у вас работы выросло вдвое, но теперь сориентируюсь на переход к параметрам. Пакеты, как понимаю, это про VHDL? 

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


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

4 минуты назад, AnatolySh сказал:

Пакеты, как понимаю, это про VHDL?

Говорят, в SV завезли пакеты. Ждём, когда нормальные функции появятся.

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


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

5 hours ago, AnatolySh said:

Прошу сказать, что не так с макросами и пнуть, как понимаю, в сторону параметров? 

Кстати, временные задержки можно писать напрямую #1us, #22ms, #33ns.

А это, конечно, страшно))

`define CNT_PULSE_RNG [`CNT_PULSE_DIM - 1 : 0]

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


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

59 minutes ago, andrew_b said:

Говорят, в SV завезли пакеты.

Они там с самого начала

59 minutes ago, andrew_b said:

Ждём, когда нормальные функции появятся.

Они и так нормальные.

6 hours ago, AnatolySh said:

Прошу простить, не упомянул в ТЗ частоту. Она там была, конечно что..

т.е. импульсы - это событие строго синхронное?

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


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

7 minutes ago, one_eight_seven said:

Они и так нормальные.

не совсем. в VHDL есть unbonded аргументы функций. В SV только фиксированной разрядности. Но, в SV есть шаблоны функций на классах (для моделирования) или на интерфейсах (для синтеза). Отсутствие синтеза функций статических классов, это большое упущение ИМХО. 

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


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

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, данные с которого по той же цепочке улетают обратно. Кто и как решил, что эти данные надо фильтровать и почему именно такую границу заложил - предстоит либо выяснить либо забить на это дело.

 

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


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

И снова здравствуйте. Пока родил вот что:

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

думаю в сторону рандомизации, хотя не уверен, что она здесь нужна

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


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

8 часов назад, AnatolySh сказал:

adc_shum_zashita

Транслит смотрится плохо. Всегда.

 

8 часов назад, AnatolySh сказал:

(.*)

Это обфускация кода. Тому, это принял в стандарт, надо отрубить головы. Тому, кот это использует, руки.

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


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

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

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

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

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

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

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

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

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

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