stalko 0 5 мая, 2005 Опубликовано 5 мая, 2005 · Жалоба Никогда раньше не писал на 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"? Как это регистры не меняют своего значения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pechkin 0 5 мая, 2005 Опубликовано 5 мая, 2005 · Жалоба Незнаю на сколько я прав, но суть примерно в следующем: все присваивания регистру RARM должны быть в одном блоке always. Так как синтезатор не может корректно обработать твои условия. У меня аналогичное было с BuildGates от Cadence пока не узнал что представленная тобой конструкция должна использоваться только для моделирования, а не для синтеза. PS Для синтеза рекомендуется использовать присваение <= вместо = PSS Но лучше узнайте у специалистов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 мая, 2005 Опубликовано 6 мая, 2005 · Жалоба Никогда раньше не писал на 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 Вы сами посмотрие на свой код ?? как можно сделать запись в ОДИН и тот Же регистр по РАЗНЫМ стробам и с разными фронтами, да еще и одновременно ?? такое в принципе нельзя реализовать на вашем семействе плис. Нужно менять подход., либо сделать память синхронной, либо усложнить логику записи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalko 0 6 мая, 2005 Опубликовано 6 мая, 2005 · Жалоба Ну вы приколист, а раньше вы на чем писали ?? Раньше я пользовал схемотехнический ввод. А писал я много на чем, но я зыки описания аппаратуры только начал пользовать. или первый раз с электроникой ?? Ровно настолько же, насколько Вы "первый раз с" русским языком. Это моя специальность, вообще-то... always @(posedge HFCC) begin RARM[3]=HFCD; end always @(negedge nWR) begin if (CS_FPGA==1) begin RARM[A]<=D; end end Вы сами посмотрие на свой код ?? как можно сделать запись в ОДИН и тот Же регистр по РАЗНЫМ стробам и с разными фронтами, да еще и одновременно ?? По разным стробам можно, при чем тут фронты непонятно (ЛЕГКО). А насчет ОДНОВРЕМЕННО... Об ОДНОВРЕМЕННО никто не говорил. Реально в ЭТОТ регистр (3-й) по второму стробу вообще писаться не будет. такое в принципе нельзя реализовать на вашем семействе плис. Нужно менять подход., либо сделать память синхронной, либо усложнить логику записи. <{POST_SNAPBACK}> P.S. И не привыкайте хамить, потом отвыкать тяжело... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 мая, 2005 Опубликовано 6 мая, 2005 · Жалоба --Раньше я пользовал схемотехнический ввод. А писал я много на чем, но языки --описания аппаратуры только начал пользовать. очень хорошо, значит задача упрощаеться. --Ровно настолько же, насколько Вы "первый раз с" русским языком. Это моя --специальность, вообще-то... Хмм ну я знаю два руских языка, официальный и сетевой - когда быстро набираешь и нет проверки синтаксиса редактором - его нужно понимать а не читать побуквенно. --По разным стробам можно, при чем тут фронты непонятно (ЛЕГКО). --А насчет ОДНОВРЕМЕННО... Об ОДНОВРЕМЕННО никто не говорил. Реально в --ЭТОТ регистр (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]. что я вам и указал. -- И не привыкайте хамить, потом отвыкать тяжело... Даже не начинал, если вы уж такой ранимый то "Чудны твои дела господи.... " Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cdg 4 6 мая, 2005 Опубликовано 6 мая, 2005 · Жалоба des00 абсолютно прав, попробуйте сначала нарисовать функциональную схему того чего Вы хотите описать, а затем преводите схему в языковое описание, поверьте, многие вопросы исчезнут сами собой, сам в свое время так со схематика уходил :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 6 мая, 2005 Опубликовано 6 мая, 2005 · Жалоба Ну стоит ли нам так расстраиваться (схемотехническим извращенцам). Мне вот тоже сейчас пришлось переходить на верилог. (Оказывается, пока я спал, появилась профессия Верилог – дизайнер). Пути господни неисповедимы. Иду по простому пути. Описываю схему таким образом (поведенческое описание), чтобы синтезатор реализовал проект на базовых мегафункциях и примитивах. Все просто и прозрачно. Наверно это хорошо иметь возможность оперировать массивом 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 уже не получить). И вообще, пора уже водку пить. Святые дни впереди. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalko 0 6 мая, 2005 Опубликовано 6 мая, 2005 · Жалоба Что бы исправить сию ситуацию нужно: 1. Внести все сигналы тактирования в один алвайс и переделать логику под регистр RARM[3]. что я вам и указал. Примерно это я сегодня и сделал (в другом модуле): сделал "слежение" за "медленным" сигналом таким образом: завел два регистра слежения, каждый такт GCLK, делал такую вещь R1<=R2; R2<=сигнал; if ({R1,R2}==2'b01) // типа posedge сигнала ... // понеслось ... т.е. примерно то, что предложил sazh Но, если честно, вариант не из красивых. А в данном модуле просто под регистр RARM3 описал отдельный регистр, на записи адрес "3" запретил, на чтении подменяю регистр. des00 абсолютно прав, попробуйте сначала нарисовать функциональную схему того чего Вы хотите описать, а затем преводите схему в языковое описание, поверьте, многие вопросы исчезнут сами собой, сам в свое время так со схематика уходил Если я начну рисовать, то мне проще будет в схематике нарисовать И вообще, пора уже водку пить. Святые дни впереди. Так уже начали... Теперь у меня вопрос такой: как мне заставить регистры в данном модуле лечь в память? В другом модуле Foundation кладет FIFO в память сам, даже по приколу попробовал 8x1. Все равно кладет. А эти регистры раздувает в регистры (масло масляное :) ) А также проект Foundation требует 24 TBUF-ов, при том, что в данной ПЛИС их ровно ноль. Что-то я не припомню, что это есть такое? И как результат: в купе со всем остальным более 100% по трем параметрам в ПЛИСе... Так сказать, не лезет Уменьшаю число регистров, и глубину FIFO и все хорошо... Вот и думаю, мож если регистры в память пихнуть, картинка улучшится. Также принимаю идею от умных людей, чего не стоит делать, чтобы проект не раздувался (вариант "ничего не писать" не рассматривается ). P.S. Насколько я понял, разница между = и <= проявляется только при симуляции? По крайней мере, так я понял из хелпа... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalko 0 6 мая, 2005 Опубликовано 6 мая, 2005 · Жалоба Кстати, мож кто знает, где взять полноценную доку по Verilog-у на русском? ... на худой конец не на русском... В принципе, буду рад и доке по VHDL, AHDL и ABEL (больше языков описания не знаю). Надо же с чем-то сравнивать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 10 мая, 2005 Опубликовано 10 мая, 2005 · Жалоба Кстати, мож кто знает, где взять полноценную доку по Verilog-у на русском? ... на худой конец не на русском... В принципе, буду рад и доке по VHDL, AHDL и ABEL (больше языков описания не знаю). Надо же с чем-то сравнивать <{POST_SNAPBACK}> Мыло где ?? есть на руском немного, но лучше стандарта 2001г (~800 стр англ. текста) нат :)) R1<=R2; R2<=сигнал; if ({R1,R2}==2'b01) // типа posedge сигнала ... // понеслось ... т.е. примерно то, что предложил sazh Но, если честно, вариант не из красивых. смеяться будете это стандартная схема выделения фронта, очень часто используеться при синхронизации блоков. Теперь у меня вопрос такой: как мне заставить регистры в данном модуле лечь в память? В другом модуле Foundation кладет FIFO в память сам, даже по приколу попробовал 8x1. Все равно кладет. А эти регистры раздувает в регистры (масло масляное) если уж пишете под хилинк то обязательно прочитайте xst.pdf - HDL Coding Techniques и cgd.pdf Constraints Guide. Там написанно как можно писать на ХДЛ и задействовать все ресурсы плис, без использования либ от производителя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalko 0 10 мая, 2005 Опубликовано 10 мая, 2005 · Жалоба Мыло где ?? есть на руском немного, но лучше стандарта 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. Там написанно как можно писать на ХДЛ и задействовать все ресурсы плис, без использования либ от производителя. <{POST_SNAPBACK}> Это Вы точно подметили: я именно хочу обойтись без либ, только средствами самого Verilog-а. Такая вот глупая самоцель... Зато переносимость получится полнейшая... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 10 мая, 2005 Опубликовано 10 мая, 2005 · Жалоба Мыло ушло. Ну полнейшая переносимость не будет, т.к. полностью констрейны вешь сугубо индивидуальная, пока. Хотя если ИСЕ начнет поддерживать синопсивские констреийны то это будет хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalko 0 11 мая, 2005 Опубликовано 11 мая, 2005 · Жалоба Мыло ушло. <{POST_SNAPBACK}> Получил, спасибо!! Но в xst.pdf не нашел, как запихать регистры в память принудительно. Мож не там искал? Видел только такой аттрибут, который командует поместить логику в память (видно как нас учили в институтские времена - "логика на ПЗУ" :rolleyes: ), но и он у меня не заработал (правда и не ругался на него), похоже это только для Виртексов. А вот чтобы конкретные регистры пихнуть в память пока не вижу, сейчас попробую, конечно, поискать повнимательнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 11 мая, 2005 Опубликовано 11 мая, 2005 · Жалоба Получил, спасибо!! Но в xst.pdf не нашел, как запихать регистры в память принудительно. Мож не там искал? Видел только такой аттрибут, который командует поместить логику в память (видно как нас учили в институтские времена - "логика на ПЗУ" :rolleyes: ), но и он у меня не заработал (правда и не ругался на него), похоже это только для Виртексов. А вот чтобы конкретные регистры пихнуть в память пока не вижу, сейчас попробую, конечно, поискать повнимательнее. <{POST_SNAPBACK}> Всегда пожалуйста. Насчет того что можно что нельзя, вообще ИМХО нужно смотреть три доки: xst.pdf, cgd.pdf, lib.pdf и сопостовляя данные можно точно узнать что может плис и как это сделать. Насчет регитсров в память не любой регистр можно сделать на памяти, это зависит от логики его функционирования, но если вы прописали констрейн указывающий сделать что то, а синтезатор сделать этого не может, он обязательно пишет почему и как это исправить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться