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

Достала ошибка "Multi-source in ..."

Никогда раньше не писал на Verilog-е, но вот решил, что время пришло. В качестве кристалла выбрался Xilinx-овский Spartan III (делаю не ради развлечения, а по работе). Пользую WebPack 7.1i .

Все написал, отсимулировал, но как только начинаю синтезировать... Прет ошибка. В двух местах ее вылечил, а в остальных не получается :wub:

Мож кто поможет?

Привожу текст одного из модулей (самого простого) и все что обнаружено относительно него в логе. Мож кому не понравится стиль написания, но я еще и половины возможностей языка не знаю...

Заранее благодарен и прошу прощение за такое большое сообщение, решил все по максимуму написать.

Текст модуля:

`timescale 1ms / 1us

module REG_ARM(A, CS_FPGA, nWR, nRD, NLB, NUB, HFCC, HFCD, D, TxHALEn,

RECEIVE, TOUT, MARKER, HAL_HDWL);

input [7:0] A;

input CS_FPGA;

input nWR;

input nRD;

input NLB;

input NUB;

input HFCC;

input [7:0] HFCD;

inout [15:0] D;

output TxHALEn;

output RECEIVE;

output [15:0] TOUT;

output MARKER;

output HAL_HDWL;

// Собственно регистры

reg [15:0] RARM [255:0];

// Определяем третье состояние

reg DEN;

reg [15:0] DO;

 

assign TxHALEn=RARM[0][0];

assign RECEIVE=RARM[1][0];

assign MARKER=RARM[1][1];

assign HAL_HDWL=RARM[1][2];

assign TOUT=RARM[2];

assign D=(DEN==0)?16'bz:DO;

 

always @(posedge HFCC)

begin

RARM[3]=HFCD;

end

 

always @(negedge nWR)

begin

if (CS_FPGA==1)

begin

RARM[A]<=D;

end

end

 

always @(negedge nRD)

begin

if (CS_FPGA==1)

begin

DO=RARM[A];

DEN=1;

end

end

 

always @(posedge nRD)

begin

DEN=0;

end

 

endmodule

Вытяжки из лога:

...Compiling verilog file "REG_ARM.v"

Module <REG_ARM> compiled...

...Analyzing module <REG_ARM>.

Module <REG_ARM> is correct for synthesis. ...

...INFO:Xst:1304 - Contents of register <DEN> in unit <REG_ARM> never changes during circuit operation. The register is replaced by logic. ...

...Synthesizing Unit <REG_ARM>.

Related source file is "REG_ARM.v".

WARNING:Xst:647 - Input <NLB> is never used.

WARNING:Xst:647 - Input <NUB> is never used.

Found 16-bit tristate buffer for signal <D>.

Found 16-bit 256-to-1 multiplexer for signal <$COND_15>.

Found 16-bit register for signal <DO>.

Found 4096-bit register for signal <RARM>.

INFO:Xst:738 - HDL ADVISOR - 4112 flip-flops were inferred for signal <RARM>. You may be trying to describe a RAM in a way that is incompatible with block and distributed RAM resources available on Xilinx devices, or with a specific template that is not supported. Please review the Xilinx resources documentation and the XST user manual for coding guidelines. Taking advantage of RAM resources will lead to improved device usage and reduced synthesis time.

Summary:

inferred 4128 D-type flip-flop(s).

inferred 16 Multiplexer(s).

inferred 16 Tristate(s).

Unit <REG_ARM> synthesized. ...

...WARNING:Xst:1710 - FF/Latch <RARM_3_15> (without init value) has a constant value of 0 in block <REG_ARM>.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <RARM_3_8> (without init value) has a constant value of 0 in block <REG_ARM>.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <RARM_3_9> (without init value) has a constant value of 0 in block <REG_ARM>.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <RARM_3_10> (without init value) has a constant value of 0 in block <REG_ARM>.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <RARM_3_11> (without init value) has a constant value of 0 in block <REG_ARM>.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <RARM_3_12> (without init value) has a constant value of 0 in block <REG_ARM>.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <RARM_3_13> (without init value) has a constant value of 0 in block <REG_ARM>.

WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <RARM_3_14> (without init value) has a constant value of 0 in block <REG_ARM>. ...

...ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <DEN>

Sources are:

Signal <XLXI_14/DEN> in Unit <REG_ARM> is assigned to VCC

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><0>>

Sources are:

Output signal of FD instance <XLXI_14/RARM_3_0>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_0>

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><5>>

Sources are:

Output signal of FD instance <XLXI_14/RARM_3_5>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_5>

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><1>>

Sources are:

Output signal of FD instance <XLXI_14/RARM_3_1>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_1>

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><6>>

Sources are:

Output signal of FD instance <XLXI_14/RARM_3_6>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_6>

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><2>>

Sources are:

Output signal of FD instance <XLXI_14/RARM_3_2>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_2>

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><7>>

Sources are:

Output signal of FD instance <XLXI_14/RARM_3_7>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_7>

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><3>>

Sources are:

Output signal of FD instance <XLXI_14/RARM_3_3>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_3>

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><4>>

Sources are:

Output signal of FD instance <XLXI_14/RARM_3_4>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_4>

 

ERROR:Xst:528 - Multi-source in Unit <REG_ARM> on signal <RARM<3><15>>

Sources are:

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_15>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_8>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_9>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_10>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_11>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_12>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_13>

Output signal of FDE_1 instance <XLXI_14/RARM_3_ren_14>

Signal <XLXI_14/N0> in Unit <REG_ARM> is assigned to GND...

Никак не пойму, что это за "Multi-source"? Нету там такого... По крайней мере, одновременно...

И что это за странное заявление "INFO:Xst:1304"? Как это регистры не меняют своего значения?

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


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

Незнаю на сколько я прав, но суть примерно в следующем: все присваивания регистру RARM должны быть в одном блоке always. Так как синтезатор не может корректно обработать твои условия. У меня аналогичное было с BuildGates от Cadence пока не узнал что представленная тобой конструкция должна использоваться только для моделирования, а не для синтеза.

PS Для синтеза рекомендуется использовать присваение <= вместо =

PSS Но лучше узнайте у специалистов

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


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

Никогда раньше не писал на Verilog-е, но вот решил, что время пришло. В качестве кристалла выбрался Xilinx-овский Spartan III (делаю не ради развлечения, а по работе). Пользую WebPack 7.1i .

Все написал, отсимулировал, но как только начинаю синтезировать... Прет ошибка. В двух местах ее вылечил, а в остальных не получается  :wub:

Мож кто поможет?

Ну вы приколист, а раньше вы на чем писали ?? или первый раз с электроникой ??

always @(posedge HFCC)

begin

RARM[3]=HFCD;

end

 

always @(negedge nWR)

begin

if (CS_FPGA==1)

begin

RARM[A]<=D;

end

end

Вы сами посмотрие на свой код ?? как можно сделать запись в ОДИН и тот Же регистр по РАЗНЫМ стробам и с разными фронтами, да еще и одновременно ??

такое в принципе нельзя реализовать на вашем семействе плис.

 

Нужно менять подход., либо сделать память синхронной, либо усложнить логику записи.

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


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

Ну вы приколист, а раньше вы на чем писали ??

Раньше я пользовал схемотехнический ввод. А писал я много на чем, но я зыки описания аппаратуры только начал пользовать.

  или первый раз с электроникой ??

Ровно настолько же, насколько Вы "первый раз с" русским языком. Это моя специальность, вообще-то...

always @(posedge HFCC)

begin

RARM[3]=HFCD;

end

 

always @(negedge nWR)

begin

if (CS_FPGA==1)

begin

RARM[A]<=D;

end

end

Вы сами посмотрие на свой код ?? как можно сделать запись в ОДИН и тот Же регистр  по РАЗНЫМ стробам и с разными фронтами,  да еще и одновременно ??

По разным стробам можно, при чем тут фронты непонятно (ЛЕГКО).

А насчет ОДНОВРЕМЕННО... Об ОДНОВРЕМЕННО никто не говорил. Реально в ЭТОТ регистр (3-й) по второму стробу вообще писаться не будет.

такое в принципе нельзя реализовать на вашем семействе плис.

Нужно менять подход., либо сделать память синхронной, либо усложнить логику записи.

P.S. И не привыкайте хамить, потом отвыкать тяжело... :biggrin:

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


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

--Раньше я пользовал схемотехнический ввод. А писал я много на чем, но языки --описания аппаратуры только начал пользовать.

очень хорошо, значит задача упрощаеться.

 

--Ровно настолько же, насколько Вы "первый раз с" русским языком. Это моя --специальность, вообще-то...

Хмм ну я знаю два руских языка, официальный и сетевой - когда быстро набираешь и нет проверки синтаксиса редактором - его нужно понимать а не читать побуквенно.

 

--По разным стробам можно, при чем тут фронты непонятно (ЛЕГКО).

--А насчет ОДНОВРЕМЕННО... Об ОДНОВРЕМЕННО никто не говорил. Реально в --ЭТОТ регистр (3-й) по второму стробу вообще писаться не будет.

Значит так ставим себя на место синтезатора. Он встречает первый always

always @(posedge HFCC)

begin

RARM[3]=HFCD;

end

и видит что вы просите его сделать запись в регистр RARM[3] по положительному фронту сигнала HFCC, при чем в любой момент времени. н принимате решение использовать регистр с динамическим тактовым входом, на тактовый вход подав сигнал HFCC.

Встречает второй алвайс

always @(negedge nWR)

begin

if (CS_FPGA==1)

begin

RARM[A]<=D;

end

end

и видит что вы просиде сдлелать запись в один из регистров RARM[3]...[0] по отрицательному фронту сигнала nWR, если выставлен сигнал разрешения CS_FPGA, причем в любой момент времени. сдесь синтезатор принимает решение сделать четрые регистра с динамическим клоком и входами разрешения., подав на тактовые входы сигнал nWR, а на разрешение CS_FPGA.

Но на клок регистра RARM уже используеться под такирование положительным фронтом сигналом HFCC, и как теперь синтезатору приладить сюда отрицательный фронт ?

Что бы исправить сию ситуацию нужно: 1. Внести все сигналы тактирования в один алвайс и переделать логику под регистр RARM[3]. что я вам и указал.

 

-- И не привыкайте хамить, потом отвыкать тяжело...

Даже не начинал, если вы уж такой ранимый то "Чудны твои дела господи.... "

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


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

des00 абсолютно прав, попробуйте сначала нарисовать функциональную схему того чего Вы хотите описать, а затем преводите схему в языковое описание, поверьте, многие вопросы исчезнут сами собой, сам в свое время так со схематика уходил :)

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


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

Ну стоит ли нам так расстраиваться (схемотехническим извращенцам). Мне вот тоже сейчас пришлось переходить на верилог. (Оказывается, пока я спал, появилась профессия Верилог – дизайнер). Пути господни неисповедимы.

Иду по простому пути. Описываю схему таким образом (поведенческое описание), чтобы синтезатор реализовал проект на базовых мегафункциях и примитивах. Все просто и прозрачно.

Наверно это хорошо иметь возможность оперировать массивом N битовых векторов.

Но почему например не организовать это как массив памяти, который ляжет на мегафункцию памяти фирмы производителя. В любом руководстве есть рекомендации. Например у Альтеры:

 

module ram (q, a, d, we, clk);

 

output [7:0] q;

input [7:0] d;

input [6:0] a;

input we, clk;

 

reg [6:0] read_add;

reg [7:0] mem [127:0];

 

always @ (posedge clk) begin

if (we)

mem[a] <= d;

read_add <= a;

end

assign q = mem[read_add];

endmodule

 

И вешайте потом на нее, что хотите.

Что касается стиля проектирования (Верилог тут не причем), то на лицо многоклоковая синхронизация, что для больших проектов не есть хорошо. Умучаетесь с временами установок и удержания данных. Понятно, что предпочтительней иметь проект с одной глобальной тактовой частотой.

Например:

module in_out (global_clk, in_clk, input_data, inout_clk, out_clk, out_data);

 

output [7:0] out_data;

output out_clk;

 

input global_clk;

input [7:0] input_data;

input in_clk;

input inout_clk;

 

reg [7:0] out_data;

reg [7:0] in_data;

reg [1:0] sdvig_in_rg;

reg [1:0] sdvig_out_rg;

 

wire e_wr_rg;

wire e_rd_rg;

 

assign out_clk = inout_clk;

 

always @ (posedge global_clk)

begin

sdvig_in_rg[1:0] <= {sdvig_in_rg[0], in_clk};

sdvig_out_rg[1:0] <= {sdvig_out_rg[0], inout_clk};

end

 

assign e_wr_rg = sdvig_in_rg[0] & ~sdvig_in_rg[1];

assign e_rd_rg = ~sdvig_out_rg[0] & sdvig_out_rg[1];

 

always @ (posedge global_clk)

begin

if (e_wr_rg == 1'b1)

in_data <= input_data;

if (e_rd_rg == 1'b1)

out_data <= in_data;

end

 

endmodule

Между двумя регистрами можно воткнуть все, что угодно.

Что касается описания регистров данных в одном процессе, то желательно использовать неблокирующее (<=) присваивание в переменную. Иначе можно наткнуться на неприятную ситуацию, когда синтезатор сваяет что то отличное от задуманного (базовый примитив типа FD8CE уже не получить).

И вообще, пора уже водку пить. Святые дни впереди.

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


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

Что бы исправить сию ситуацию нужно: 1. Внести все сигналы тактирования в один  алвайс и переделать логику под регистр RARM[3]. что я вам и указал.

Примерно это я сегодня и сделал (в другом модуле): сделал "слежение" за "медленным" сигналом таким образом: завел два регистра слежения, каждый такт GCLK, делал такую вещь

R1<=R2;

R2<=сигнал;

if ({R1,R2}==2'b01) // типа posedge сигнала

... // понеслось

... т.е. примерно то, что предложил sazh

Но, если честно, вариант не из красивых.

А в данном модуле просто под регистр RARM3 описал отдельный регистр, на записи адрес "3" запретил, на чтении подменяю регистр.

 

des00 абсолютно прав, попробуйте сначала нарисовать функциональную схему того чего Вы хотите описать, а затем преводите схему в языковое описание, поверьте, многие вопросы исчезнут сами собой, сам в свое время так со схематика уходил

Если я начну рисовать, то мне проще будет в схематике нарисовать :biggrin:

 

И вообще, пора уже водку пить. Святые дни впереди.

Так уже начали...

 

Теперь у меня вопрос такой: как мне заставить регистры в данном модуле лечь в память?

В другом модуле Foundation кладет FIFO в память сам, даже по приколу попробовал 8x1. Все равно кладет.

А эти регистры раздувает в регистры (масло масляное :) )

А также проект Foundation требует 24 TBUF-ов, при том, что в данной ПЛИС их ровно ноль. Что-то я не припомню, что это есть такое?

И как результат: в купе со всем остальным более 100% по трем параметрам в ПЛИСе... Так сказать, не лезет :blush:

Уменьшаю число регистров, и глубину FIFO и все хорошо... Вот и думаю, мож если регистры в память пихнуть, картинка улучшится.

Также принимаю идею от умных людей, чего не стоит делать, чтобы проект не раздувался (вариант "ничего не писать" не рассматривается :biggrin: ).

 

P.S. Насколько я понял, разница между = и <= проявляется только при симуляции? По крайней мере, так я понял из хелпа...

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


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

Кстати, мож кто знает, где взять полноценную доку по Verilog-у на русском? ... на худой конец не на русском...

В принципе, буду рад и доке по VHDL, AHDL и ABEL (больше языков описания не знаю). Надо же с чем-то сравнивать :biggrin:

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


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

Кстати, мож кто знает, где взять полноценную доку по Verilog-у на русском? ... на худой конец не на русском...

В принципе, буду рад и доке по VHDL, AHDL и ABEL (больше языков описания не знаю). Надо же с чем-то сравнивать  :biggrin:

Мыло где ?? есть на руском немного, но лучше стандарта 2001г (~800 стр англ. текста) нат :))

R1<=R2;

R2<=сигнал;

if ({R1,R2}==2'b01) // типа posedge сигнала

... // понеслось

... т.е. примерно то, что предложил sazh

Но, если честно, вариант не из красивых.

смеяться будете это стандартная схема выделения фронта, очень часто используеться при синхронизации блоков.

Теперь у меня вопрос такой: как мне заставить регистры в данном модуле лечь в память?

В другом модуле Foundation кладет FIFO в память сам, даже по приколу попробовал 8x1. Все равно кладет.

А эти регистры раздувает в регистры (масло масляное)

если уж пишете под хилинк то обязательно прочитайте xst.pdf - HDL Coding Techniques и cgd.pdf Constraints Guide. Там написанно как можно писать на ХДЛ и задействовать все ресурсы плис, без использования либ от производителя.

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


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

Мыло где ?? есть на руском немного, но лучше стандарта 2001г (~800 стр англ. текста) нат :))

[email protected] , буду крайне благодарен.

R1<=R2;

R2<=сигнал;

if ({R1,R2}==2'b01) // типа posedge сигнала

... // понеслось

... т.е. примерно то, что предложил sazh

Но, если честно, вариант не из красивых.

смеяться будете это стандартная схема выделения фронта, очень часто используеться при синхронизации блоков.

Не буду смеяться, просто учту на будующее.

Теперь у меня вопрос такой: как мне заставить регистры в данном модуле лечь в память?

В другом модуле Foundation кладет FIFO в память сам, даже по приколу попробовал 8x1. Все равно кладет.

А эти регистры раздувает в регистры (масло масляное)

если уж пишете под хилинк то обязательно прочитайте xst.pdf - HDL Coding Techniques и cgd.pdf Constraints Guide. Там написанно как можно писать на ХДЛ и задействовать все ресурсы плис, без использования либ от производителя.

Это Вы точно подметили: я именно хочу обойтись без либ, только средствами самого Verilog-а. Такая вот глупая самоцель... Зато переносимость получится полнейшая... :biggrin:

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


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

Мыло ушло.

Ну полнейшая переносимость не будет, т.к. полностью констрейны вешь сугубо индивидуальная, пока. Хотя если ИСЕ начнет поддерживать синопсивские констреийны то это будет хорошо.

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


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

Мыло ушло.

Получил, спасибо!!

Но в xst.pdf не нашел, как запихать регистры в память принудительно. Мож не там искал?

Видел только такой аттрибут, который командует поместить логику в память (видно как нас учили в институтские времена - "логика на ПЗУ" :rolleyes: ), но и он у меня не заработал (правда и не ругался на него), похоже это только для Виртексов. А вот чтобы конкретные регистры пихнуть в память пока не вижу, сейчас попробую, конечно, поискать повнимательнее.

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


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

Получил, спасибо!!

Но в xst.pdf не нашел, как запихать регистры в память принудительно. Мож не там искал?

Видел только такой аттрибут, который командует поместить логику в память (видно как нас учили в институтские времена - "логика на ПЗУ"  :rolleyes: ), но и он у меня не заработал (правда и не ругался на него), похоже это только для Виртексов. А вот чтобы конкретные регистры пихнуть в память пока не вижу, сейчас попробую, конечно, поискать повнимательнее.

Всегда пожалуйста. Насчет того что можно что нельзя, вообще ИМХО нужно смотреть три доки: xst.pdf, cgd.pdf, lib.pdf и сопостовляя данные можно точно узнать что может плис и как это сделать.

Насчет регитсров в память не любой регистр можно сделать на памяти, это зависит от логики его функционирования, но если вы прописали констрейн указывающий сделать что то, а синтезатор сделать этого не может, он обязательно пишет почему и как это исправить.

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


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

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

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

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

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

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

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

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

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

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