Verilog: `define + `ifdef verzusz parameter + generate + if

Fórumok

Egy Veriloggal kapcsolatos kerdes: mi a kulonbseg nyelvi szinten a

`define SOME_FEATURE
....
`ifdef SOME_FEATURE
reg ...
wire = ...
...
`else
wire = ...
`endif

es a 

parameter SOME_FEATURE = 1;
...
generate
if ( SOME_FEATURE) begin
     reg ...
     wire = ...
end else begin
     wire = ...
end
endgenerate

formaban megadott felteteles szintezis kozott? Ugy tunik mintha ezutobbi valami modon komplexebb RTL-t eredmenyez (az eroforrashasznalatbol), mintha a parameter is egy kulso vezetek lenne... pedig nem igazan kene kulonbsegnek lennie...

Hozzászólások

Szerkesztve: 2020. 05. 13., sze - 10:59

ifdeffel csak azt vizsgálod, hogy amit tesztelsz, az van-e vagy nincs.

if ()-el meg komplexebb vizsgálatot csinálhatsz (bármit, amit megadhatsz feltételnek).

Ha csak ennyire használod, mint a példában, szerintem se kéne különbségnek lenni.

A parametert azt persze, hogy kívülről is tudod változtatni, de csak szintézis-időben, egy szimulátor lehet, hogy több erőforrást emészt fel ilyen esetben, de a fizikai eszközön nem kéne, hogy különbség legyen.

Koszi, kozben elkezdtem jatszani es kisebb (~150-200LC-s) design-oknal tenyleg nincs kulonbseg. Egy nagyobbnal (~2300 LC) pedig igy mint a meseben: "hol volt, hol nem volt" kulonbseg. De ez mar siman lehet a Yosys nyigja, mert ott olyat is lattam mar hogy logikai azonossagok eseten is mas-mas a kimenet. Pl egy `wire k = x & y & z;` es egy `wire k = 1 & x & y & z` tud kulonbozni. Mondjuk 4-inputos LUT-ok mellett siman lehet hogy ez varhato is... 

Elso korben a parameter-ekbol ugyanis ilyen wire x = 0 meg x = 1 tipusu vezetekek lesznek bizonyos esetekben es ugy megy bele az informacio a kombinacios/szekvencialis reszekbe, abban bizvan hogy a szintezis jol kioptimalizalja. 

Nem kellene, hogy kulonbseg legyen. Mit hasznalsz? Regen hasznaltam mar, de Vivadonal (elotte pedig ISE-nel) egy rakas opcio volt RTL-re, ami kulonbozo optimalizaciokat kapcsolt be/ki.

Ezt Yosys-szal csinalom most, de nemsokara egyreszt megnezem egy lebutitott design-on is a kerdest (tenylegesen erre fokuszalva) es megnezem iCEcube2-n is ezt a lebutitott valtozatot. Szoval siman lehet hogy ez valami bug-szeruseg a Yosys-ban. De igen, pont ahogy mondjatok, szerintem sem kellene kulonbsegnek lennie. 

Hm, na, ugylatszik van egy kulonbseg. A Yosys-nal (ezt a LUT/LC szamot leszamitva) kb ugyanugy megy a generate + if mint az `ifdef ... `endif, Xilinx Vivado-nal viszont ezt nem ette meg:

parameter have_interrupt = ...;
...
generate
        if ( have_interrupt ) begin
                wire is_tail_reti = INSTR[4] & iflag;
                wire is_interrupt = I & iflag & (state==STATE_NORMAL);
        end else begin
                wire is_tail_reti = 0;
                wire is_interrupt = 0;
        end
endgenerate

Csak ezt:

parameter have_interrupt = ...;

...

wire is_tail_reti;
wire is_interrupt;

generate
        if ( have_interrupt ) begin
                assign is_tail_reti = INSTR[4] & iflag;
                assign is_interrupt = I & iflag & (state==STATE_NORMAL);
        end else begin
                assign is_tail_reti = 0;
                assign is_interrupt = 0;
        end
endgenerate

Persze ezutobbi is teljesen logikus, de pont az `ifdef logikajanak mond ellent.

Ezt talaltam: https://forums.xilinx.com/t5/Design-Methodologies-and/SystemVerilog-gen…

However you cannot access the register "pipe" from outside that generate scope

(ahol ez a "pipe" az valami olyasmi mint nalam a ket wire lenne)

Szoval akkor ez ezekszerint a Verilog ezen tulajdonsaga mar nem annyira sztenderdizalt. Alteraeknal meg Lattice-knel imigy szeretik, Xilinx-eknel meg amugy...

https://inst.eecs.berkeley.edu/~cs150/fa06/Labs/verilog-ieee.pdf (182 = 169. oldal): 

To support the interconnection between structural elements and/or procedural blocks, generate statements permit the following Verilog data types to be declared within the generate scope: net, reg, integer, real, time, realtime, and event.

Szoval ez is azt mondja hogy "within the generate scope".