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

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


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 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
 
Start new topic
Ответов
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 353
Регистрация: 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



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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:28
Рейтинг@Mail.ru


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