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

Не пишет в регистр при симуляции

reg     [DWIDTH-1:0]      Data[31:0];

initial begin
  for (i = 0; i < 31; i = i + 1) begin
    Data[i] = i;
  end  
end


always @(posedge i_clk) 
begin
  if ( i_we ) begin
    Data[1] <= /*i_wdata*/78;
    // Debug use only
    $display("%0dns REG[x%0d] = %0d ", $time/1000, i_waddr, Data[1]);
  end

Привет Всем. Определил память и произвожу туда запись, затем с помощью функции отображаю в консоли. Вопрос: Почему отображается значение то, которым была инициализирована память а не 78??? Когда вместо неблокирующего оператора ставлю блокирующий то выводит 78.

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


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

Приветствую!

23 minutes ago, Fynjisx said:

...

always @(posedge i_clk) 
begin
  if ( i_we ) begin
    Data[1] <= /*i_wdata*/78;
    // Debug use only
    $display("%0dns REG[x%0d] = %0d ", $time/1000, i_waddr, Data[1]);
  end

Привет Всем. Определил память и произвожу туда запись, затем с помощью функции отображаю в консоли. Вопрос: Почему отображается значение то, которым была инициализирована память а не 78??? Когда вместо неблокирующего оператора ставлю блокирующий то выводит 78.

Вы пишете в память неблокирующим присваиванием и тут же читаете из нее. А при неблокирующим присваивании  новое значение в память попадет только в момент выхода из блока обработки always (после вашего чтения).

Поэтому либо читайте на следующем такте, либо используете для памяти блокирующее присваивание.  

 

Удачи! Rob.

 

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


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

9 часов назад, RobFPGA сказал:

Поэтому либо читайте на следующем такте, либо используете для памяти блокирующее присваивание.  

Либо использовать $strobe  вместо $display. $strobe выполняется в конце цикла обработки планировщика, поэтому показывает уже присвоенные неблокирующим присваиванием значения.

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


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

54 minutes ago, dxp said:

Либо использовать $strobe  вместо $display. $strobe выполняется в конце цикла обработки планировщика, поэтому показывает уже присвоенные неблокирующим присваиванием значения.

так не работает этот код,

always @(posedge i_clk) 
begin
  if ( i_we ) begin
    Data[i_waddr] <= i_wdata;
    $strobe("%0dns REG[x%0d] = %0d ", $time/1000, i_waddr, Data[i_waddr]);    
  end

end

выдает четыре последние записи, а первую теряет,

# 130ns REG[x6] = 6 
# 150ns REG[x7] = 7 
# 170ns REG[x8] = 8 
# 190ns REG[x0] = 0 

а должно быть так(я записываю в х4,х6,х7,х8):

# 130ns REG[x4] = 3 
# 150ns REG[x6] = 4 
# 170ns REG[x7] = 5 
# 190ns REG[x8] = 6 

 

 

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


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

1 hour ago, Fynjisx said:

выдает четыре последние записи, а первую теряет,

Опять таки неблокирующее присваивание. Внутри выражения always у вас происходит присваивание и по-видимому, первый раз не срабатывает $strobe (нужно смотреть как работает).

Попробуйте вынести за always блок любые отображения.

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


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

22 часа назад, Fynjisx сказал:

так не работает этот код,

logic [3:0] cnt = 0;

always_ff @(posedge clk) begin
    
    if(cnt <  10) begin
        cnt <= cnt + 1;
        $display("\ndisplay> cnt: %x", cnt);
        $strobe ("strobe>  cnt: %x", cnt);
    end

end
# display> cnt: 0
# strobe>  cnt: 1
# 
# display> cnt: 1
# strobe>  cnt: 2
# 
# display> cnt: 2
# strobe>  cnt: 3
# 
# display> cnt: 3
# strobe>  cnt: 4
# 
# display> cnt: 4
# strobe>  cnt: 5
# 
# display> cnt: 5
# strobe>  cnt: 6
# 
# display> cnt: 6
# strobe>  cnt: 7
# 
# display> cnt: 7
# strobe>  cnt: 8
# 
# display> cnt: 8
# strobe>  cnt: 9
# 
# display> cnt: 9
# strobe>  cnt: a

 

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


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

Давеча наткнулся на Gotch'у одну. Там была схожая ситуация.

Если Ваша переменная i_wdata создана в функции или таске, которые находятся в интерфейсе, пакете или статической группе, они будут статическими. Что означает, что инициализация и переприсваивание произойдёт при конструкции этой функции или таска.

Короче говоря, припишите атрибут automatic причастным функциям или такскам, а лучше все тестовые возмущения делайте и выводите с автоматической программы (program automatic)

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


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

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

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

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

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

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

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

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

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

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