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

ModelSim 10.5 error vs 10.6 warning

Всем добра
Есть собственноручно написанный проект и тестбенч к нему.
В проекте есть такие строки
 

// states for monitor
`define STATE_DIM_M 5
`define STATE_RNG_M (`STATE_DIM_M-1):0 

`define CH_NUM 4
`define CH_RNG (`CH_NUM - 1):0
                    
module monitor...
reg  access_rx_reg [`CH_RNG];  

reg [`STATE_RNG_M] state;

parameter 
  ST_IDLE               = `STATE_DIM_M'h0,
  
  ST_ACCESS_TX_START_0  = `STATE_DIM_M'h1,
  ST_ACCESS_TX_START_1  = `STATE_DIM_M'h2,
  ST_ACCESS_TX_START_2  = `STATE_DIM_M'h3,
  ST_ACCESS_TX_START_3  = `STATE_DIM_M'h4,  
  
  ST_ACCESS_RX_START_0  = `STATE_DIM_M'h5,
  ST_ACCESS_RX_START_1  = `STATE_DIM_M'h6,
  ST_ACCESS_RX_START_2  = `STATE_DIM_M'h7,
  ST_ACCESS_RX_START_3  = `STATE_DIM_M'h8,
  
  ST_ACCESS_TX_0        = `STATE_DIM_M'h9,
  ST_ACCESS_TX_1        = `STATE_DIM_M'ha,
  ST_ACCESS_TX_2        = `STATE_DIM_M'hb,
  ST_ACCESS_TX_3        = `STATE_DIM_M'hc,
  
  ST_ACCESS_RX_0       	= `STATE_DIM_M'hd,
  ST_ACCESS_RX_1        = `STATE_DIM_M'he,  
  ST_ACCESS_RX_2        = `STATE_DIM_M'hf,
  ST_ACCESS_RX_3        = `STATE_DIM_M'h10,
  
  ST_DONE               = `STATE_DIM_M'h11;   

В тестбенче tmain_m.sv же я хочу обратиться к регистру

    // attach main monitor module
    monitor  mon_inst(.*);
    
    task process_monitor_state;
    input logic [`STATE_RNG_M] monitor_state_4_reset;
        forever @(posedge mc64M)
            case (monitor_state_4_reset)   
                mon_inst.ST_ACCESS_RX_3, mon_inst.ST_ACCESS_RX_2, mon_inst.ST_ACCESS_RX_1, mon_inst.ST_ACCESS_RX_0: begin
                    if (mon_inst.state == mon_inst.ST_IDLE) begin
                        force mon_inst.access_rx_reg[monitor_state_4_reset - mon_inst.ST_ACCESS_RX_0] = 1'b1;
                    end

ModelSim SE-64 vlog 10.5 Compiler 2016.02 Feb 13 2016 по компиляции выдаёт:
# ** Error: tmain_m.sv(1009): Illegal left-hand side in continuous assignment.

ModelSim SE-64 vlog 10.6d Compiler 2018.02 Feb 24 2018 же выдаёт:
# ** Warning: (vsim-12113) tmain_m.sv(1009): Force of a variable select having non-constant indices may produce unexpected results.

 

Почему такие различия и что делать? Заранее спасибо.

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


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

наверное неконстантный индекс массива, о чем и пишет. Такое не засентизируется вроде. По крайней мере у меня и об этом везде пишут.

Для этого есть трюки с индексацией

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


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

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

7 minutes ago, AnatolySh said:

Почему такие различия и что делать?

IMHO различия скорее всего потому что 10.5 раньше вообще не поддерживал force для variable index переменных. А в 10.6 такой функционал добавили. Но при этом есть риск - так как может быть в runtime  выход за пределы корректного индекса для force не проверяется (например  ваше выражение для индекса access_rx_reg неоднозначно, формально могут быть и отрицательные величины)  о чем modelsim и предупреждает.  

Удачи! Rob.      

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


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

On 12/12/2019 at 3:29 PM, RobFPGA said:

выражение для индекса access_rx_reg неоднозначно, формально могут быть и отрицательные величины

Да, но при компиляции ModelSim видит, какие именно выражения для индекса я присваиваю, и мог бы ругаться именно при выходе за границы, а не на умозрительную возможность оных. В любом случае, спасибо вам за пояснения.

On 12/12/2019 at 3:24 PM, new123 said:

у меня и об этом везде пишут

У вас - это где?

On 12/12/2019 at 3:24 PM, new123 said:

трюки с индексацией

Расскажете? )

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


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

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

17 minutes ago, AnatolySh said:

Да, но при компиляции ModelSim видит, какие именно выражения для индекса я присваиваю, и мог бы ругаться именно при выходе за границы, а не на умозрительную возможность оных. В любом случае, спасибо вам за пояснения.

А с чего вы взяли что при компиляции эти индексы известны?  Модуль  monitor и модуль tmain_m компилируются  независимо.  Вы не знаете какие значения реально имеют переменные mon_inst.ST_ACCESS_RX_0, ...  пока  при  старте симуляции не слинкуется  все в одно целое. Фактически при компиляции в tmain_m у вас видна ссылка на  именованную переменную.  А в каком модуле  эта переменная реально будет находится   зависит еще и от того что вы слинкуете по ссылке  mon_inst 

Удачи! Rob.

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


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

4 hours ago, AnatolySh said:

Расскажете? )

у меня в избранном ссылка, часто ее открываю, когда делаю массивы. Стараюсь делать их редко.

https://stackoverflow.com/questions/18067571/indexing-vectors-and-arrays-with

RobFPGA частенько тут на вопросы отвечает, как выкрутиться в динамической индексации.

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


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

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

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

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

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

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

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

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

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

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