SystemVerilog: автоматические переменные не могут иметь неблокирующих назначений, появляющихся для статического регистра - PullRequest
0 голосов
/ 18 сентября 2018

Я начинаю получать эту ошибку после того, как я на самом деле делаю регистр статическим.

Это хорошо в Quartus:

task InitAutoRefresh;

       reg [$clog2(AUTOREFRESH_CLOCKS):0] AutoRefreshCounter = 0;

       AutoRefreshCounter <= AutoRefreshCounter + 1;
       InitState <= (AutoRefreshCounter < AUTOREFRESH_CLOCKS) ? InitState : InitState + 1;       

       InitCmd <= (AutoRefreshCounter == 0) ? CMD_AR : CMD_NOP;

endtask

Но Modelsim выдает мне эту ошибку:

# ** Error (suppressible): C:/projects/Camera-RAM-VGA/Ram.sv(137): (vlog-2244) Variable 'AutoRefreshCounter' is implicitly static. You must either explicitly declare it as static or automatic
# or remove the initialization in the declaration of variable.

Теперь, когда я добавляю static перед reg [$clog2(AUTOREFRESH_CLOCKS):0] AutoRefreshCounter = 0; Кварт дает мне эту ошибку (которая выглядит как противоположность моего изменения):

Error (10959): SystemVerilog error at Ram.sv(139): illegal assignment - automatic variables can't have non-blocking assignments

И это указывает на регистр, который яЯ только что добавил ключевое слово * 1014 для!

Единственное возможное объяснение, о котором я могу подумать, это то, что когда я добавляю static к этому единственному reg, он начинает трактовать другие регистры как automatic, нотогда номер строки в сообщении об ошибке неверен.

1 Ответ

0 голосов
/ 18 сентября 2018

Я бы просто переместил объявление AutoRefreshCounter за пределы задачи.Тогда становится ясно, что переменная должна быть инициализирована только один раз в момент времени 0. (Это причина сообщения об ошибке «Неявно статический», во-первых).

...