2016-07-15 2 views
0

Я хочу соединить десятичную строку со строкой. Как:Verilog конкатенация десятичного и строкового литералов

parameter AWIDTH = 15; 
... 
... 

wire [AWIDTH-1:0] addra_bus; 
assign addra_bus = cg_one ? {addra} : {AWIDTH, "'bz"}; 

На основной из 'cg_one', он выбрал бы либо {addra} или {AWIDTH, "" BZ"}. В ложном состоянии тернарного оператора я конкатенирую AWIDTH с помощью bz. Если cg_one равен 1'b0, я должен получить 15'bz как значение в addra_bus. Имеют смысл?

Проблема заключается в синтезе этого кода. Я получаю предупреждение как:

WARNING: expression size 56 truncated to fit in target size 15 (VERI-1209) 

Почему это так? С чего начинается размер 56?

ответ

3

Вы не должны использовать строковый литерал. Все, что вам нужно сделать, это

assign addra_bus = cg_one ? addra : 'z; 

'z будет расширена до ширины addra_bus

+2

На первый взгляд, я думал, что это волшебный материал. :) Но, к сожалению, это не сработало. На этот раз написание сообщения erroe: 'ERROR: синтаксическая ошибка около '(VERI-1137)' –

+3

Это законный SystemVerilog (см. Раздел 5.7.1 Целочисленные константы литерала 1800 LRM), но, возможно, ваш инструмент синтеза не поддерживает Это. Вы также можете попробовать '{AWIDTH {1'bz}}', что, я думаю, вы пытались сделать в первую очередь. –

+1

Ох. Думаю, я должен был конкретно упомянуть о verilog. И да, может быть возможность моего инструмента не поддерживать его. Во всяком случае, ваше второе предложение '{AWIDTH {1'bz}} работало. Надеюсь, он вернет мне «15bz». Спасибо за письмо. –

1

Вы пытаетесь сохранить по умолчанию 32 бит AWIDTH и 24 бит "'bz" (всего 56 бит) в 15 бит addra_bus.

Вы должны ограничить ширину AWIDTH и увеличить ширину addra_bus. Например:

parameter AWIDTH = 6'd30; 

wire [AWIDTH-1:0] addra_bus; 
assign addra_bus = cg_one ? {addra} : {AWIDTH, "'bz"}; 
+0

Спасибо за писать это. Я ценю. Что делать, если я не хочу писать AWIDTH в двоичном формате. Для меня это десятичное значение. –

0

Как Дэйв уже упоминалось поставить автобус на высокое состояние вы можете сделать assign addra_bus = cg_one ? addra : {AWIDTH{1'bz}}; Но установка на автобус до «г» в синтезируемом коде нежелательно, пока вы не будете управлять сигналом ввода-вывода уровня чипа.

Если вы хотите отобразить строку 15'bz в шине для отладки.

reg [7:0] val = {"0"+AWIDTH%10}; 
reg [7:0] val1 = {("0"+AWIDTH/10)}; 
assign addra_bus = cg_one ? {addra} : {val,val1}; 

[если вы Param размер только до 99.] [Как вам нужно 8 бит на символ приведенный выше код отображает только «15»]

Смежные вопросы