реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> SV testbench, как в initial описать синхронные воздейтсвия
dcs
сообщение Apr 1 2018, 10:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 1-07-13
Из: СПб
Пользователь №: 77 337



здравствуйте,

хотел сделать 2 эквивалентных куска генерации входных воздействий на фифо.

Код
initial
begin        
    fork
        /////////////////////////////////////////////////////////////////////////
        pulse_gen:
        begin
            forever
            begin
                randcase
                    1: rand_pulse = 1;
                    5: rand_pulse = 0;
                endcase
                @(posedge aclk);
            end
        end
        /////////////////////////////////////////////////////////////////////////
        push_data:
        begin
            wait(aresetn_done);
            
            forever
            begin
                s_axis_tlast  = 0;
                s_axis_tuser  = 0;
                
                if (s_axis_tready == 1) // FIFO ready to receive data
                begin
                    s_axis_tvalid = rand_pulse;
                    if (rand_pulse)
                        s_axis_tdata  = $urandom_range(255,0);                    
                    
                    @(posedge aclk);
                end
                else
                begin
                    s_axis_tdata = 0;
                    
                    @(posedge aclk);
                end
            end
        end
        /////////////////////////////////////////////////////////////////////////
    join_none
end


и

Код
always_ff @(posedge aclk)
begin
    if (aresetn == 1'b0)
    begin
        s_axis_tvalid <= 0;
        s_axis_tdata <= 0;
    end
    else
    begin
        s_axis_tvalid <= s_axis_tready & rand_pulse;
        if (s_axis_tready & rand_pulse)        
            s_axis_tdata <= $urandom_range(255,0);
    end
end


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

в первом случае работает неверно (пропускается первый байт в пачке), во втором - все хорошо.




подскажите в чем проблема и как исправить?



спасибо.
Go to the top of the page
 
+Quote Post
OM-S
сообщение Apr 1 2018, 16:56
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 12-05-05
Из: г. Москва
Пользователь №: 4 944



Кажется эта ситуация называется race condition.
Данные и valid меняются "одновременно" с клоком, поэтому новые значения могут захватиться либо на текущем клоке, либо только на следующем (на усмотрение симулятора). Поставьте после
@(posedge aclk) небольшую паузу #1 и тогда изменения сигалов будет гарантированно после фронта слока.

По этому поводу (и по многим другим) очень рекомендую почитать книжку Verilog and system verilog gotchas. 101common coding errors and how to avoid them.
Go to the top of the page
 
+Quote Post
AVR
сообщение Apr 2 2018, 06:21
Сообщение #3


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 320
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(OM-S @ Apr 1 2018, 19:56) *
Кажется эта ситуация называется race condition

В моделсиме (и вообще в стандарте) приоритет одновременных операций в процессе симуляции четко задан.
Откуда там может быть расизм?


--------------------
Go to the top of the page
 
+Quote Post
Sergey_Bekrenyov
сообщение Apr 2 2018, 14:52
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 314
Регистрация: 14-12-10
Из: Королёв
Пользователь №: 61 599



Посмотрите clocking block

http://www.asic-world.com/systemverilog/clocking1.html
Go to the top of the page
 
+Quote Post
OM-S
сообщение Apr 2 2018, 21:01
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 12-05-05
Из: г. Москва
Пользователь №: 4 944



Цитата(AVR @ Apr 2 2018, 09:21) *
В моделсиме (и вообще в стандарте) приоритет одновременных операций в процессе симуляции четко задан.
Откуда там может быть расизм?


Расизм я вижу между параллельными fork-ами и собственно захватом данных в фифо по фронту aclk.
Код
begin
...
      1: rand_pulse = 1;
      5: rand_pulse = 0;
@(posedge aclk);
...
end

и
Код
begin
...
     s_axis_tvalid = rand_pulse;
     if (rand_pulse)
            s_axis_tdata  = $urandom_range(255,0);                    
      @(posedge aclk);
...
end

Какой из блоков выполнится первым и какое значение (старое или новое) s_axis_tvalid, s_axis_tdata защелкнится на входе ФИФО по фронту клока?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2018 - 06:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.00999 секунд с 7
ELECTRONIX ©2004-2016