mikrocontroller.net

Forum: FPGA, VHDL & Co. Xilinx unisim library und ghdl, DCM tut nicht


Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi allerseits,

ich habe einen Design mit DCM (input clk=20ns, dcm-clk=10ns), der 'auf 
Arbeit' unter ISE10.1+Windows prima simuliert (ModelSim).

Jetzt versuche ich zuhause unter Ubuntu8.04 die Simulation mit 'ghdl' 
ans laufen zu bekommen. Dazu habe ich die Xilinx libs und den Design 
folgendermassen compiliert und simuliert:
Unisim Library
--------------
mkdir ~/Misc/vhdl/unisim
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit unisims/unisim_VCOMP.vhd
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit unisims/unisim_VPKG.vhd
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit unisims/unisim_VITAL.vhd
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit unisims/unisim_SMODEL.vhd

Design
------
mkdir ~/Misc/vhdl/<design>
mkdir ~/Misc/vhdl/<design>/work
ghdl -i --workdir=work *.vhd
ghdl -m --workdir=work -P../unisim --ieee=synopsys -fexplicit <design_tb>
ghdl -r top_iis_labcar_tb --vcd=<design_tb>.vcd
gtkwave <design_tb>.vcd &

Scheint prinzipiell zu funktionieren, ein BRAM kann ich prima 
ansprechen. Nur aus dem DCM kommt keine Clock raus :o(

Hat da jemand einen Tipp fuer mich?

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, nachdem keine Antwort kam...

Ich habe mir einen kleinen Mini-DCM selbst geschrieben, der bedient den 
clk-out sowie den locked.

Funzt erstmal prima, aber ich muss natuerlich eine neue entity in dem 
Design einbinden, also m.E. nach suboptimal.

Wenn keiner 'ne Idee hat, dann ist das hier halt 'closed'...

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist die Lib irgendwie zu alt. Ich arbeite noch mit 9.2.0.4 
unter Win XP, da geht die Simulation des DCM mit Modelsim auch nicht 
korrekt (das Locked geht nie auf High).

Autor: THe ImAgEr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auflösung auf ps gestellt? :-)

Autor: berndel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo/wie stelle ich in ghdl die Auloesung denn ein?

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo berndl,

hast du eine Loesung dafuer gefunden? Ich habe gerade das gleiche 
Problem...

Gruesse

Sven

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nee, leider nicht...

Ich verwende fuer die Simulation halt einen eigenen 'hand-made' DCM

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

 genau das Problem habe ich gerade gelöst.

ISE 11.4


Ausgegangen bin ich von der Anleitung.
http://aoa.vwthunderstorm.de/wiki/FPGA_Linux_Simulation

Leider ist das Simulationsskript in ganz ok. Die DCM ist im 
Unterverzeichnis primitive von der Unisim und das muss mit angeben 
werden.


PS:
Als Simulationsausgabe nutze das Format ghw das ist für VHDL besser.

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal in plaintext. Bei meinem Webbrowser konnte ich die Shell nicht 
online öffnen.
#---------------------------------------------
#remove library directories if they exist
cd ../libs
if [ -e work ]; then
  rm -r work
fi
if [ -e unisim ]; then
  rm -r unisim
fi

#make new directories
mkdir work
mkdir unisim
cd ..

echo 'compile xilinx unisim libraries'
ghdl -i --work=unisim --workdir=libs/unisim 
/opt/Xilinx/11.1/ISE/vhdl/src/unisims/*.vhd
ghdl -i --work=unisim --workdir=libs/unisim 
/opt/Xilinx/11.1/ISE/vhdl/src/unisims/primitive/*.vhd
echo 'compile design files'
ghdl -i --workdir=libs/work ../rtl/*.vhd

echo 'make a design'
ghdl -m -g -Plibs/unisim --workdir=libs/work --warn-default-binding 
--warn-binding --warn-library --warn-body --warn-specs --warn-unused 
--ieee=synopsys $2

echo '=================================='
echo 'design consists of following units:'
echo '----------------------------------'
ghdl -d --work=work --workdir=libs/work
echo '===================================='
echo 'detected following design hierarchy:'
echo '------------------------------------'

echo 'run the testbench'
ghdl -r $2  --disp-tree=inst --stop-time=20000ns --wave=waveform/$1.ghw

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe zu GHDL und Unisim ein Dokument verfasst, um das Problem der 
Einbindung der Unisim schneller in griff zu bekommen.


Es baut auf einen VGA Beispiel auf. Hier wird an der der Auflösung 
erhöht und dabei kommt man nicht um eine Taktvervielfachung mit der DCM 
nicht herum.


http://www.dossmatik.de/ghdl/ghdl_unisim.pdf

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

um den alten Thread nochmal auszugraben...

Ich hatte mir bisher damit geholfen, dass ich einen 'hand-made' DCM 
gebaut habe. Dieser wurde als component 'dcm_test' eingebunden, dann 
waren in der Instantiierung halt 2 Zeilen, der originale DCM von Xilinx 
und mein 'dcm_test' auszuwaehlen (mittels Kommentar).

Jetzt habe ich vor, einen Spartan3 Multiplier zu benutzen. Ich bin 
wieder ueber das Problem gestolpert, dass GHDL nix sinnvolles rauswirft.

Ich hab's mal mit den Xilinx 11.1 Libs versucht, genauso wie Rene es 2 
Posts weiter oben beschrieben hat. Aber es kommt nix raus....


Also Preisfrage: Wer hat GHDL mit den Xilinx Libs (DCM, Multiplier, ...) 
am laufen und wie hat er das hingekriegt?

Ich vermute, es liegt an den Pikosekunden, die in den Libs immer wieder 
verwendet werden. Und ich habe bisher noch nix gefunden, wie ich GHDL 
diese Pikosek. Aufloesung beibringen kann.


Hat da jemand den Durchblick?

Gruss,
- berndl

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, ich habe jetzt mal den VHDL code aus der Xilinx Lib (bei mir 10.3) 
fuer den Multiplier in eine eigene entity/component reinkopiert und die 
eine Stelle an der was mit 'ps' stand durch '1 ns' ersetzt. Und: Nix 
geht!

Ich kriege aus dem Multiplier MULT18X18S nur 'xxx' raus!

Also ich bin mit meinem Latein jetzt am Ende.......

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernd,



hast du ein Screenshot von gtkwave?
oder eine Fehlermeldung

1. Also die DCM zumindest habe ich mit GHDL zum Laufen bekommen. Das 
habe ich auch in dem Beispielcode genutzt.

2. Ich habe auch bereits Multiplikationen mit GHDL simuliert. Das war 
z.B. in einem 2D Cosinustransformator für einen jpeg Decoder.
VHDL stellt mit der Numeric lib eine Multiplikation bereit, die auch 
synthetisiert werden kann.


use IEEE.numeric_std.all;

Autor: hobbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich verwende ISIM statt GHDL. Damit gelingt die Simulation aller
Xilinx-Komponenten (habe auch GTX,TEMAC/EMAC,DSP48(E)...ausgiebigst
probiert) ohne Probleme.
EINZIGE VORAUSSETZUNG: die Auflösung muss immer auf 1PS gesetzt
werden (vieleicht klappen auch ein paar PS). Stellt man die Auflösung 
wesentlich gröber, dann kriegt man nur noch XXXX.
Versuch also einfach mal, GHDL 1PS als Auflösung beizubringen.

Gruss

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René D. schrieb:
> 1. Also die DCM zumindest habe ich mit GHDL zum Laufen bekommen. Das
> habe ich auch in dem Beispielcode genutzt.

DCM habe ich jetzt mit der 11.1 Lib noch nicht probiert, versuche ich 
nochmal

>
> 2. Ich habe auch bereits Multiplikationen mit GHDL simuliert. Das war
> z.B. in einem 2D Cosinustransformator für einen jpeg Decoder.
> VHDL stellt mit der Numeric lib eine Multiplikation bereit, die auch
> synthetisiert werden kann.

Ja, das funktioniert, aber ich wollte die Komponente instantiieren.

Ich spiel heute nochmal ein bisschen rum...


@hobbie: Auf dem Rechner ist gar kein ISE drauf, ich habe nur die Libs 
vom Windowsrechner gezogen. Und wie ich bei GHDL 1ps Aufloesung 
einstelle koennte eines der Probleme sein. Ich habe dazu noch nix 
gefunden...

Autor: hobbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe selbst noch kein GHDL benutzt, kenne uA aber
mehrere Anleitungen wie diese:
http://www.dossmatik.de/ghdl/ghdl_unisim_eng.pdf
Hier wird (angeblich erfolgreich) eine DCM simuliert.

Viel Spass

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe jetzt nochmal rumgespielt. Ich habe ein Ubuntu 8.04 (will 
demnaechst auf 10.04 umsteigen). Die Xilinx Webpack Libraries von 11.1 
liegen unter ~/Misc/vhdl/unisims. Da gibt es 'unisim_VCOMP.vhd' und 
'unisim_VPKG.vhd'. Dazu noch ein Subdirectory 'primitive' mit den ganzen 
Files (1043 Objekte).

Jetzt ein Directory '~/Misc/vhdl/unisim' angelegt, dann 'cd ~/Misc/vhdl' 
und
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit 
unisims/*.vhd
sowie
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit 
unisims/primitive/*.vhd

Das funktionierte nur, nachdem ich in 
'~/Misc/vhdl/unisims/primitive/RAM16BWE.vhd' die 6 Zeilen
--    variable Write_A_Write_B : memory_collision_type := 
Write_A_Write_B;
--    variable Read_A_Write_B  : memory_collision_type := 
Read_A_Write_B;
--    variable Write_A_Read_B  : memory_collision_type := 
Write_A_Read_B;
--    variable Write_B_Write_A : memory_collision_type := 
Write_B_Write_A;
--    variable Read_B_Write_A  : memory_collision_type := 
Read_B_Write_A;
--    variable Write_B_Read_A  : memory_collision_type := 
Write_B_Read_A;
auskommentiert habe. Das hatte ich auch schon mit den Libs von 10.3 so. 
Der ganze Krempel liegt also kompliert unter '~/Misc/vhdl/unisim' sowie 
im Source unter '~/Misc/vhdl/unisims'.

Flugs einen Design, der mit meinem 'hand-made' DCM funktioniert (und 
auch in der echten HW sowie mit ModelSim XE und PE mit dem 'echten' DCM) 
kompiliert und: => NIX. Keine Clock 2x aus dem DCM!


Also ich versteh's nicht. Meinen Design starte ich (ein subdirectory von 
~/Misc/vhdl/ mit
* ghdl -i --workdir=work *.vhd
* ghdl -m --workdir=work -P../unisim --ieee=synopsys -fexplicit 
<design_tb>
* ghdl -r <design_tb> --vcd=<design_tb>.vcd

Also, hat jemand mal einen Beispieldesign mit DCM (oder wahlweise auch 
Multiplier), der mit den Xilinx Libraries und GHDL funktioniert? Ich 
krieg's nicht hin...

Gruss+schoenen Sonntag noch,
- berndl

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Um mehreres auszuschließen, habe es gerade mit der aktuellen Version 
12.3 ausprobiert. Ich nutze Linux und habe ein Makefile für den Vorgang 
DCM erstellt. Besser kann ich es nicht erkären.

Im makefile muss der Path zur ISE stimmen. Der sollte entsprechend 
angepasst werden. Ich habe hier den Standard verwendet.
Das Makefile lädt die Testbench und ein VGA VHDL Beispiel, in der eine 
DCM enthalten ist,von meiner Homepage herunter.

Dann wird GHDL angeschoben und die Simulation erstellt eine ghw Datei.
ghw ist für VHDL besser geeignet.


also

make
make view

und dann in gtkwave die entscheidenden Signal auswählen und darstellten.

Bernd du schaffst das noch.
Ich kenne jetzt auch nicht alle Optionen von GHDL. Ich glaube du musst 
die unisim auch mit ghdl -i .... explizit auch einbinden.

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Makefile als plain text nochmal, falls jemand den Anhang oben nicht 
sieht.




ISE_PATH=/opt/Xilinx/12.3/ISE_DS/ISE


all:
  mkdir vga1024x768
  cd vga1024x768
  wget http://www.dossmatik.de/ghdl/tb_vga.vhd
  wget http://www.dossmatik.de/ghdl/vga1024_768.vhd
  ghdl -i --work=unisim $(ISE_PATH)/vhdl/src/unisims/*.vhd
  ghdl -i --work=unisim $(ISE_PATH)/vhdl/src/unisims/primitive/*.vhd
  ghdl -i *.vhd
  ghdl -m -g -Punisim --warn-unused --ieee=synopsys tb_vga
  ghdl -r tb_vga --stop-time=20000ns --wave=vga.ghw

view:
  gtkwave  vga.ghw

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rene,
danke, probiere ich heute abend zuhause mal aus.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sodele,

hab' mal Renes Vorschlag befolgt und bin wie oben beschrieben 
vorgegangen. Und: Funktioniert!

Jetzt faellt mir auf, dass ich die Xilinx Lib mit dem ghdl Schalter -a 
kompiliert habe, bei Rene steht da -i.

Komisch nur, dass zumindest das BRAM auch mit meiner Methode 
funktioniert, nicht hingegen DCM und Multiplier.

Also: Ich sehe ein, es geht. Danke fuer die Hilfen!

Gruss,
- berndl

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, nachdem Renes Design auch bei mir tut habe ich mal einen meiner 
Designs nach gleichem Schema getestet: Tut nix! Und das obwohl die HW 
damit schon 1-1/2 Jahre laeuft...

Hier mal mein Code zur DCM Instantiierung (clk ist die 50MHz Input 
Clock, clk100 meine 2x FPGA Clock):
   IBUFG_inst : IBUFG
   generic map (
      IOSTANDARD => "DEFAULT")
   port map (
      O => clkbuf,     -- Clock buffer output
      I => clk        -- Clock buffer input (connect directly to top-level port)
   );

   BUFG_inst : BUFG
   port map (
      O => clk100,       -- Clock buffer output
      I => clkdcm        -- Clock buffer input
   );

   DCM_inst : DCM generic map (
      CLKDV_DIVIDE => 2.5,         --  Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
                          --     7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
      CLKFX_DIVIDE => 1,           --  Can be any interger from 1 to 32
      CLKFX_MULTIPLY => 4,         --  Can be any integer from 1 to 32
      CLKIN_DIVIDE_BY_2 => FALSE,     --  TRUE/FALSE to enable CLKIN divide by two feature
      CLKIN_PERIOD => 20.0,            --  Specify period of input clock
      CLKOUT_PHASE_SHIFT => "NONE",   --  Specify phase shift of NONE, FIXED or VARIABLE
      CLK_FEEDBACK => "2X",           --  Specify clock feedback of NONE, 1X or 2X
      DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS",   --  SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
                                --     an integer from 0 to 15
      DFS_FREQUENCY_MODE => "LOW",     --  HIGH or LOW frequency mode for frequency synthesis
      DLL_FREQUENCY_MODE => "LOW",     --  HIGH or LOW frequency mode for DLL
      DUTY_CYCLE_CORRECTION => FALSE,   --  Duty cycle correction, TRUE or FALSE
      FACTORY_JF => X"C080",            --  FACTORY JF Values
      PHASE_SHIFT => 0,              --  Amount of fixed phase shift from -255 to 255
      STARTUP_WAIT => FALSE)         --  Delay configuration DONE until DCM LOCK, TRUE/FALSE
   port map (
      CLK0 => open,         -- 0 degree DCM CLK ouptput
      CLK180 => open,       -- 180 degree DCM CLK output
      CLK270 => open,       -- 270 degree DCM CLK output
      CLK2X => clkdcm,       -- 2X DCM CLK output
      CLK2X180 => open,     -- 2X, 180 degree DCM CLK out
      CLK90 => open,         -- 90 degree DCM CLK output
      CLKDV => open,         -- Divided DCM CLK out (CLKDV_DIVIDE)
      CLKFX => open,         -- DCM CLK synthesis out (M/D)
      CLKFX180 => open,     -- 180 degree CLK synthesis out
      LOCKED => dcm_locked,   -- DCM LOCK status output
      PSDONE => open,       -- Dynamic phase adjust done output
      STATUS => open,       -- 8-bit DCM status bits output
      CLKFB => clk100,       -- DCM clock feedback
      CLKIN => clkbuf,       -- Clock input (from IBUFG, BUFG or DCM)
      PSCLK => '0',         -- Dynamic phase adjust clock input
      PSEN => '0',           -- Dynamic phase adjust enable input
      PSINCDEC => '0',       -- Dynamic phase adjust increment/decrement
      RST => '0'            -- DCM asynchronous reset input
   );

clkdcm und clk100 machen keinen Mucks, sind immer auf logisch 'high'...

Sieht da jemand meinen Fehler?

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super Bernd,
vieleicht kannst du mir auch mal helfen.

eigentlich müsste es auch mit -a gehen. Es scheint ein Problem in der 
unisim zu sein. Xilinx ist hier nicht ganz sauber mit dem VHDL Standard.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René D. schrieb:
> Super Bernd,

nee, nicht wirklich. Bei mir tut der DCM ja immer noch nicht...

Bisher habe ich nur gesehen, dass dein DCM funktioniert (50MHz -> 
75MHz). Meiner (50 -> 100) haelt sich immer noch vornehm zurueck......

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du deinen Code mit einer Testbench posten?

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, ich stripp den Code mal runter bis aufs Minimum und poste das mal 
hier. Kann aber 1-2 Tage dauern bis ich dazu Zeit habe. Wuerde mich echt 
interessieren was da schief laeuft...

Gruss+danke,
- berndl

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> Bei mir tut der DCM ja immer noch nicht...

Schau mal hier, ob alle Bedingungen zutreffen:

http://forums.xilinx.com/t5/Simulation-and-Verific...

Duke

P.S.: Das wäre dann kein ghdl-Problem, sondern ein wie verwende ich das 
DCM-Modell-Problem.

Autor: berndl (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Duke,

hab' mich erstmal nicht getraut zu antworten, bevor ich die Simulation 
angeschmissen habe :o)

Hier mal ein Spieldesign (dcm_test_tb) mit 3 Variationen des Xilinx DCM. 
Die 3 Variationen sind:
* Renes DCM von weiter oben
* Mein DCM auch von weiter oben
* Ein am Freitag mit ISE10.3 und dem Wizard generierter DCM 2x Design

Das ganze mit den Xilinx 10.3 Libraries (liegen bei mir hier in einem 
'Parallelverzeichnis' zum Design), die Library wie auch weiter oben 
beschrieben compiliert.

Jetzt in meinem Target Verzeichnis (wo die .vhd Files liegen) folgendes 
gemacht:
* mkdir work
* ghdl -i --workdir=work *.vhd
* ghdl -m --workdir=work -P../unisim --ieee=synopsys -fexplicit 
dcm_test_tb
* ghdl -r dcm_test_tb --vcd=dcm_test_tb.vcd
* gtkwave dcm_test_tb.vcd &

Der Eingang ist clk50_in, die Ausgaenge sind clk75_rene_out, 
clk100_berndl_out und xil_wiz_clk2x_out.

Renes clk75 funktioniert. Meine und auch die Xilinx-Wizard generierte 2x 
Clock funktionieren nicht! In Modelsim funktioniert meine Clock, auch in 
der echten HW seit 1-1/2 Jahren.

Hat da irgend jemand eine Idee?

Gruss,
- berndl

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> Hat da irgend jemand eine Idee?
Nicht wirklicht. Ich bekomme es hier mit ghdl nicht simuliert:

ghdl -i --work=unisim BUFG.vhd DCM.vhd DCM_SP.vhd IBUFG.vhd unisim_VCOMP.vhd unisim_VPKG.vhd

ghdl -i berndl_dcm.vhd dcm_test_tb.vhd rene_dcm.vhd xil_wiz_dcm.vhd

ghdl -m -g -Punisim --ieee=synopsys dcm_test_tb
..\ieee\timing_b.vhd:196:15:warning: procedure "vitalerror" is never referenced
..\ieee\timing_b.vhd:217:15:warning: procedure "vitalerror" is never referenced
..\ieee\prmtvs_b.vhd:1041:15:warning: function "toedge" is never referenced

ghdl -r dcm_test_tb --stop-time=1us --vcd=../dcm_test_tb.vcd
rene_dcm.vhd:34:4:warning: component instance "clkin_ibufg_inst" is not bound
rene_dcm.vhd:18:14:warning: (in default configuration of rene_dcm(behavioral))
rene_dcm.vhd:38:4:warning: component instance "clk0_bufg_inst" is not bound
rene_dcm.vhd:18:14:warning: (in default configuration of rene_dcm(behavioral))
rene_dcm.vhd:44:4:warning: component instance "clkfx_bufg_inst" is not bound
rene_dcm.vhd:18:14:warning: (in default configuration of rene_dcm(behavioral))
rene_dcm.vhd:49:3:warning: component instance "dcm_sp_inst" is not bound
rene_dcm.vhd:18:14:warning: (in default configuration of rene_dcm(behavioral))
berndl_dcm.vhd:23:4:warning: component instance "ibufg_inst" is not bound
berndl_dcm.vhd:12:14:warning: (in default configuration of berndl_dcm(behavioral))
berndl_dcm.vhd:31:4:warning: component instance "bufg_inst" is not bound
berndl_dcm.vhd:12:14:warning: (in default configuration of berndl_dcm(behavioral))
berndl_dcm.vhd:37:4:warning: component instance "dcm_inst" is not bound
berndl_dcm.vhd:12:14:warning: (in default configuration of berndl_dcm(behavioral))
xil_wiz_dcm.vhd:45:4:warning: component instance "clkin_ibufg_inst" is not bound
xil_wiz_dcm.vhd:36:14:warning: (in default configuration of xil_wiz_dcm(behavioral))
xil_wiz_dcm.vhd:49:4:warning: component instance "clk2x_bufg_inst" is not bound
xil_wiz_dcm.vhd:36:14:warning: (in default configuration of xil_wiz_dcm(behavioral))
xil_wiz_dcm.vhd:53:4:warning: component instance "dcm_inst" is not bound
xil_wiz_dcm.vhd:36:14:warning: (in default configuration of xil_wiz_dcm(behavioral))

Er findet offenbar die IBUFs und die DCMs nicht.
ghdl -d --work=unisim
entity bufg
architecture bufg_v of bufg
entity dcm_clock_divide_by_2
architecture dcm_clock_divide_by_2_v of dcm_clock_divide_by_2
entity dcm_maximum_period_check
architecture dcm_maximum_period_check_v of dcm_maximum_period_check
entity dcm_clock_lost
architecture dcm_clock_lost_v of dcm_clock_lost
entity dcm
architecture dcm_v of dcm
entity dcm_sp_clock_divide_by_2
architecture dcm_sp_clock_divide_by_2_v of dcm_sp_clock_divide_by_2
entity dcm_sp_maximum_period_check
architecture dcm_sp_maximum_period_check_v of dcm_sp_maximum_period_check
entity dcm_sp_clock_lost
architecture dcm_sp_clock_lost_v of dcm_sp_clock_lost
entity dcm_sp
architecture dcm_sp_v of dcm_sp
entity ibufg
architecture ibufg_v of ibufg
package vcomponents
package vpkg
package body vpkg

Hab ich was übersehen?

Duke

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
> Hab ich was übersehen?
>
> Duke

Berndl hat drei DCM-Varianten.

Du must die Testbench nehmen und eine DCM. Du hast gleich alle drei in 
das Projekt importiert. Ich hatte noch keine Zeit es mir genauer von 
Berndl anzuschauen. Will die Woche es mir auch mal reinziehen.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey danke fuer eure Bemuehungen...

@duke: Die Xilinx Libs wie oben (post vom 29.5.2009, der Eingangspost) 
compiliert (vorher die angemeckerten Zeilen in den Libs auskommentiert), 
dann den Design wie im post vom 24.10.2010 compiliert (in dem Post steht 
auch nochmal wie die Lib compiliert wurde). Tut bei mir syntaktisch 
fehlerfrei. Das ganze mit den Libs von ISE 10

@all: Wenn ich Renes DCM nehme, den Teiler/Multiplier auf 2/4 setze, 
dann kommt auch eine schoene 100MHz Clock raus.
Es muss also irgendwie an dem Clock2x Output des DCM liegen, da ist 
naemlich Funkstille... Weil ja auch aus dem Xilinx erzeugten Teil (mit 
dem Wizard) nix rauskommt... Unter Modelsim XE und PE auf Arbeit 
funktioniert alles...

Gruss,
- berndl

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre die nächste Frage, was ISIM und Modelsim.

Also Modelsim geht.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISIM habe ich noch nie probiert. Ich nehme aber mal an, dass das dort 
funktioniert. Ist ja schliesslich die komplette Xilinx Toolchain. Die 
Bloesse, dass da was nicht tut, werden sie sich sicher nicht geben.

Ich denke halt, dass sich GHDL mit der Beschreibung des DCM 2x (also der 
'einfache' Taktverdoppler) da irgendwie verhaut. Aber ich habe leider 
noch keinen Plan, was da schief geht...

Ich muss mir nochmal das Datenblatt nehmen und gucken, was an deiner und 
meiner Implementierung des DCM unterschiedlich ist. Bei mir ist es ja 
der clock2x, bei dir der eigentlich kompliziertere Teil mit 
clock*mult/div...

Gruss,
- berndl

Autor: Duke Scarring (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mit ISIM geht es:
vhpcomp *.vhd

fuse -o tb.exe dcm_test_tb

cmd /c "c:\Xilinx\12.2\ISE_DS\settings64.bat; tb.exe -gui"



GHDL meldet mir nach gefühlten fünf Minuten Laufzeit:
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
[Error: 3]

:-(

Duke

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Duke,

was ich erwartet habe. Mit ISIM geht es. Und, danke, meine 
Implementierung verhaelt sich genauso wie die des Xilinx Wizards.

Also bezueglich GHDL: Irgendwas mit dem CLK2x output funktioniert da 
nicht richtig. Ob's nun GHDL oder Xilinx ist, weiss ich nicht...

PS: Wenn du bei Renes DCM mal den Divisor auf 2 laesst und den 
Multiplikator auf 4 setzt, dann wirst du eine wunderschoene 100MHz clock 
(=2x) am Ausgang sehen...

Also ich hab's mal an die ghdl mailing list geschrieben, mit Verweis auf 
den Thread hier. Evtl. schreibe ich das auch mal an Xilinx.

Danke fuer euer Interesse Jungs!

Gruss,
- berndl

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit GHDL bekomme ich es immer noch nicht hin...
$ uname -srvmo
CYGWIN_NT-6.1-WOW64 1.7.5(0.225/5/3) 2010-04-12 19:07 i686 Cygwin

$ ghdl --version
GHDL 0.29 (20100109) [Sokcho edition]
 Compiled with GNAT Version: GPL 2009 (20090519)
 mcode code generator
Written by Tristan Gingold.

$ xst -?
Release 12.2 - xst M.63c (nt64)
Copyright (c) 1995-2010 Xilinx, Inc.  All rights reserved.


$ ghdl -a --work=unisim --ieee=synopsys -fexplicit --syn-binding unisims/unisim_VCOMP.vhd unisims/unisim_VPKG.vhd unisims/primitive/IBUFG.vhd unisims/primitive/BUFG.vhd unisims/primitive/DCM_SP.vhd unisims/primitive/DCM.vhd

$ ghdl -i  --syn-binding *.vhd 

$ ghdl -m --ieee=synopsys -fexplicit --syn-binding dcm_test_tb
..\ieee\timing_b.vhd:196:15:warning: procedure "vitalerror" is never referenced
..\ieee\timing_b.vhd:217:15:warning: procedure "vitalerror" is never referenced
..\ieee\prmtvs_b.vhd:1041:15:warning: function "toedge" is never referenced

$ ghdl -r dcm_test_tb --vcd=dcm_test_tb.vcd 
                                  
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
[Error: 3]

Sehr merkwürdig.

Duke

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, also nochmal im Stenogramm:

ich habe hier ein Directory ~/Misc/vhdl

Darunter habe ich die Xilinx ISE 10 Library in einem Subdirectory 
./unisims liegen. Dann mache ich:

mkdir ~/Misc/vhdl/unisim
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit 
unisims/unisim_VCOMP.vhd
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit 
unisims/unisim_VPKG.vhd
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit 
unisims/unisim_VITAL.vhd
ghdl -a --work=unisim --workdir=unisim --ieee=synopsys -fexplicit 
unisims/unisim_SMODEL.vhd

Also alles nach ./unisim compiliert. Bei den 10 und 11 Libraries musste 
ich noch

(Achtung: in unisim_VITAL.vhd muessen die Zeilen
> -    variable Read_A_Write_B  : memory_collision_type := Read_A_Write_B;
> -    variable Write_A_Read_B  : memory_collision_type := Write_A_Read_B;
> -    variable Write_B_Write_A : memory_collision_type := Write_B_Write_A;
> -    variable Read_B_Write_A  : memory_collision_type := Read_B_Write_A;
> -    variable Write_B_Read_A  : memory_collision_type := Write_B_Read_A;
> +--    variable Write_A_Write_B : memory_collision_type := Write_A_Write_B;
> +--    variable Read_A_Write_B  : memory_collision_type := Read_A_Write_B;
> +--    variable Write_A_Read_B  : memory_collision_type := Write_A_Read_B;
> +--    variable Write_B_Write_A : memory_collision_type := Write_B_Write_A;
> +--    variable Read_B_Write_A  : memory_collision_type := Read_B_Write_A;
> +--    variable Write_B_Read_A  : memory_collision_type := Write_B_Read_A;

auskommentieren.

Mein Design liegt in ~/Misc/hugo

Darin mache ich ein

mkdir ~/Misc/vhdl/hugo/work

Dann gehe ich nach 'hugo' und lege los:

ghdl -i --workdir=work *.vhd
ghdl -m --workdir=work -P../unisim --ieee=synopsys -fexplicit 
<design_tb>
ghdl -r <design_tb> --vcd=<design_tb>.vcd
gtkwave <design_tb>.vcd &

(<design_tb> halt entsprechend der Testbench ersetzen...

Und dann arbeite ich damit. Also damit solltest du die Libs compilieren 
koennen und auch den Design.

Wo hakt's denn bei dir?

Gruss,
- berndl

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> Wo hakt's denn bei dir?

Das mit den verschiedenen Verzeichnissen/Laufwerken scheint unter cygwin 
nicht so recht zu funktionieren. Daher hab ich alles von unisims in 
einen lokalen Unterordner gesteckt.

Außerdem scheint Xilinx etwas aufgeräumt zu haben:
$ ls unisims
primitive/  secureip/  unisim_VCOMP.vhd  unisim_VPKG.vhd

Dann hat er wegen den bindings rumgemosert. Das habe ich mit 
--syn-binding in den Griff bekommen.

Jetzt scheitert es nur noch am Ausführen der Simulation (siehe Fehler 
oben).  Möglicherweise kommt er mit meinen 64 Bit nicht klar.

Duke

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm,

bei ISE 10 waren die Libs ja noch folgendermassen:
-> unisims
   unisim_SECUREIP.vhd
   unisim_SMODEL.vhd
   unisim_VCOMP.vhd
   unisim_virtex5_SMODEL.vhd
   unisim_VITAL.vhd
   unisim_VPKG.vhd

bei ISE 11 wars dann:
   unisim_VCOMP.vhd
   unisim_VPKG.vhd
   primitive/*
(mit den ganzen primitives drin...)

Ich hab' das ganze sowohl mit den 11ern als auch mit den 10ern probiert, 
und es hat, bis auf die bekannten Fehler in den Libs, problemlos 
compiliert.

Gruss,
- berndl

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute es fehlt ein Eintrag in der Sensitve list in der DCM.
Hier ein Beispiel aus der DCM. In diesem Process müsste der Clock in die 
sensitive list.
 Die anderen Simulatoren vervollständigen die sensitve List automatisch 
und GHDL triggert nicht, weil es nicht durch den Code "informiert" ist, 
auf einen Flankenwechsel zu warten. Das wäre eine mögliche Erklärung.



  gen_reset : process
  begin
    if (rising_edge(clock)) then
      rst_reg(0) <= rst;
      rst_reg(1) <= rst_reg(0) and rst;
      rst_reg(2) <= rst_reg(1) and rst_reg(0) and rst;
    end if;
    wait on clock;
  end process gen_reset;

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René D. schrieb:
> Ich vermute es fehlt ein Eintrag in der Sensitve list in der DCM

Nein, daran liegt es nicht. Die Prozesse im DCM-Modell haben alle ein 
"wait on ...". Damit entfällt die sensitivity-list.

Bei Ergänzung hagelt es sonst diesen Fehler:
unisims/primitive/DCM.vhd:68:5: wait statement not allowed in a sensitized process

Duke

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> problemlos compiliert.
Das ist auch nicht das Problem. Nur der Simulator rennt nicht so recht.

Duke

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
> Bei Ergänzung hagelt es sonst diesen Fehler:
>
> unisims/primitive/DCM.vhd:68:5: wait statement not allowed in a
> sensitized process
> 
>
> Duke

Das geht leider nicht. Der Prozess ist sonst beidseitig terminiert. GHDL 
kann es nicht und ob so etwas in VHDL erlaubt ist, wäre die Frage.

Ich habe das Problem auf die GHDL mailing list gesetzt. Mal sehen ob, 
jemand noch ein paar Tricks hat.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hab' mich jetzt auch mal auf die GHDL mailing list setzen lassen. 
Bin mal gespannt, was von der Seite kommt. Man koennte das ganze ja auch 
mal Xilinx zukommen lassen, es riecht doch schon etwas danach, dass die 
mit ihren Libraries ganz fies tricksen. Und da sie ja Bausteine 
verkaufen wollen, sollte eine gute Simulatorunterstuetzung auch in ihrem 
Interesse sein...

Gruss,
- berndl

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> Hallo zusammen,
>
> ich hab' mich jetzt auch mal auf die GHDL mailing list setzen lassen.
> Bin mal gespannt, was von der Seite kommt. Man koennte das ganze ja auch
> mal Xilinx zukommen lassen, es riecht doch schon etwas danach, dass die
> mit ihren Libraries ganz fies tricksen. Und da sie ja Bausteine
> verkaufen wollen, sollte eine gute Simulatorunterstuetzung auch in ihrem
> Interesse sein...
>
> Gruss,
> - berndl


Ich sehe deine Eintrag nicht in der GHDL Mailing list.

Ich hatte das Thema bereit drauf gesetzt und bis jetzt keine Rückmeldung 
erhalten.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich war da noch nicht angemeldet, meine mail wurde also nur mal bei den 
Leuten zur Diskussion gestellt. Aber da du es ja 'offiziel' eingekippt 
hast ist's ja ok.

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in der Mailing List habe ich gelesen, dass ein illegaler VHDL Construct 
in der DCM beseitigt wurde. Ich hatte noch keine Zeit zu testen ob die 
DCM jetzt besser läut. Es wäre sehr interessant, da die DCM häufig 
benutzt wird.
Das wäre sehr interessant.
______________________________________________________________________

  Between ISE 11.2 and 13.2 the module
    DCM_CLKGEN
  failed to compile for unisim as well as simprim. This is finally fixed
  in ISE 13.3. The reason was an illegal VHDL construct (arithmetic
  with mixed types, which is not allowed in VHDL) which is apparently
  tolerated by most commercial VHDL simulators, but not accepted by 
ghdl.

- Simulations of DCM's

  This is known to be unstable at best. Between November 2009 and 
November
  2010 several postings on ghdl-discuss touched in this, look for the
  threads

    Xilinx Unisim DCM is not working.in GHDL
    DCM from Xilinx unisim

  My experience as of ISE 13.1 is that in general no output clock is
  generated and that models with DCM's fail to work, and as far as I
  know the issue was never resolved.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.