Fynjisx 0 26 июня, 2019 Опубликовано 26 июня, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 26 июня, 2019 Опубликовано 26 июня, 2019 · Жалоба это весь тестбенч? i_clk и i_we где нибудь меняются? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 26 июня, 2019 Опубликовано 26 июня, 2019 · Жалоба Приветствую! 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 32 27 июня, 2019 Опубликовано 27 июня, 2019 · Жалоба 9 часов назад, RobFPGA сказал: Поэтому либо читайте на следующем такте, либо используете для памяти блокирующее присваивание. Либо использовать $strobe вместо $display. $strobe выполняется в конце цикла обработки планировщика, поэтому показывает уже присвоенные неблокирующим присваиванием значения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fynjisx 0 27 июня, 2019 Опубликовано 27 июня, 2019 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 27 июня, 2019 Опубликовано 27 июня, 2019 · Жалоба 1 hour ago, Fynjisx said: выдает четыре последние записи, а первую теряет, Опять таки неблокирующее присваивание. Внутри выражения always у вас происходит присваивание и по-видимому, первый раз не срабатывает $strobe (нужно смотреть как работает). Попробуйте вынести за always блок любые отображения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 32 28 июня, 2019 Опубликовано 28 июня, 2019 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 8 июля, 2019 Опубликовано 8 июля, 2019 · Жалоба Давеча наткнулся на Gotch'у одну. Там была схожая ситуация. Если Ваша переменная i_wdata создана в функции или таске, которые находятся в интерфейсе, пакете или статической группе, они будут статическими. Что означает, что инициализация и переприсваивание произойдёт при конструкции этой функции или таска. Короче говоря, припишите атрибут automatic причастным функциям или такскам, а лучше все тестовые возмущения делайте и выводите с автоматической программы (program automatic) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться