Xilinx Cores simulieren

Gast #2218829
Lesenswert?

Hallo,
ich versuche schon seit zwei Tagen einen Multiplizierer, den ich mir im 
Coregen erstellt habe, zu simulieren. Habe mir mittels Coregen unter 
Math einen normalen Multi 2x32bit mit 5 Pipelinestufen und ce erstellt. 
Dann die .v-Datei in ein neues Projekt für Spartan3E eingefügt und 
folgende Testbench drumherum gebaut:
1
`include "../ce_p_multiplier.v"
2

3
module mutli_tb();
4
reg clock, enable;
5
reg [35 : 0] a;
6
reg [31 : 0] b;
7
wire [63 : 0] p;
8

9
// Initialize all variables
10
initial begin        
11
  $display ("time\t clk reset enable counter");  
12
  $monitor ("%g\t %b   %b     %b      ", 
13
    $time, clock, enable, p);  
14
  clock <= 1;       // initial value of clock
15
  enable <= 0;      
16
  a <= 2;
17
  b <= 5;
18
  #10 enable <= 1;  
19
  
20
  
21
  #1000 enable <= 0; 
22
  #5 $finish;      // Terminate simulation
23
end
24

25
// Clock generator
26
always begin
27
  #5 clock <= ~clock; // Toggle clock every 5 ticks
28
end
29

30
// Connect DUT to test bench
31
ce_p_multiplier multi(
32
  enable, clock, a, b, p
33
);
34

35
endmodule

Wenn ich das ganze jetzt allerdings mit ISIM simuliere, liegt am Ausgang 
des multis eine konstante 0 an, egal was ich an die Eingänge lege und 
wie lange ich es laufen lasse.
Im Internet habe ich nur von ähnlichen Problemen mit ModelSIM gelesen, 
weil man dafür die XilinxCoreLib erst kompilieren muss. Für ISIM sind 
sie ja bereits vorkompiliert. Liegen bei mir auch etliche v-Dateien in:

F:\Vista\Xilinx\ISE_DS\ISE\verilog\src\XilinxCoreLib

Habe jetzt schon stundenlang google gefragt und Xilinx-Tutorials 
gewälzt. Muss ich die diese Corelib noch irgendwo eintragen? 
(Verilogprojekt?)

Hab die Version 12.2 des ISE und Windows 7 Prof 64bit.

Wäre froh, wenn mir jemand helfen könnte, ich bin echt am Verzweifeln...

Danke im Voraus.
Michael
Gast #2218871
Lesenswert?

Der Reset steht nur noch oben in der Ausgabeliste fürs Display 
(Copy&Paste). Genutzt wird er nicht, da der Multi selbst ja keinen Reset 
hat. Er hat nur ce, clk, a, b und die Ausgabe p.

Also laut Xilinx sollte er 6 Takte brauchen bis das Ergebnis am Ausgang 
anliegt. Aber egal ob ich 6, 10, 20 oder 103 Takte (jeweils nach dem 
ce-high versteht sich) mache liegt am Ausgang dauerhaft die 0 an.
Gast #2218977
Lesenswert?

Japp, da die Deklaration des erzeugten Multiplizierers so aussieht:
1
module ce_p_multiplier (
2
  ce, clk, a, b, p
3
)/* synthesis syn_black_box syn_noprune=1 */;
4
  input ce;
5
  input clk;
6
  input [31 : 0] a;
7
  input [31 : 0] b;
8
  output [63 : 0] p;
Gast #2219702
Lesenswert?

Inferieren?

Wo genau? Bei diesen ganzen Guides blick ich nicht mehr durch... Und 
dann sind die auch teilweise mehrere hundert Seiten lang. Hab jetzt 
allein das In deepth Tut für ISIM und den ISIM Usersguide durchgeschaut.

Ich brauche halt 7 Multiplizierer in meinem Projekt wo sie auf 3 
verschiedene Module verteilt werden sollen.
Persönliche Seite #2219719
Lesenswert?

Duke Scarring schrieb:
> Spricht was dagegen den Multiplizierer und die Pipelinestufen direkt zu
> inferieren? Wie das geht, steht im XST USer guide...

Beispiele zur direkten Verwendung der ganzen Xilinx Komponenten findest 
du hier (nicht die neueste Version vermutlich):

http://www.xilinx.com/support/documentation/sw_manuals/xilinx12_4/spartan3e_hdl.pdf

Zu dem eigentlichen Problem kann ich aber nix sagen...
Gast #2219729
Lesenswert?

Sebastian B. schrieb:
> Beispiele zur direkten Verwendung der ganzen Xilinx Komponenten findest
> du hier (nicht die neueste Version vermutlich):
>
> http://www.xilinx.com/support/documentation/sw_man...
Ja, aber die direkten Primitives verwende ich nur im Notfall, z.B. beim 
DCM (ich mag dieses Wizardgeklicke nicht, paßt nicht in meinen 
Workflow...)

Ich meinte
xst.pdf ->
Chapter 3 XST HDL Coding Techniques ->
Multipliers HDL Codingn Techniques -->
Pipelined Multipliers HDL Coding Techniques -->
Pipelined Multiplier (Outside, Single) Verilog Coding Example

Duke
#2219737
Lesenswert?

Gerade bei den Standard-Mul usw. muss man keinen Core verwenden. Einfach 
die Operation hinschreiben und gut. XST macht automatisch den HW-Mul 
rein, wo es geht. Das nennt sich dann "infer" im englischen. Auf Deutsch 
könnte man dazu "Aus der Beschreibung ableiten" sagen, das Wort 
"inferieren" gibts nicht.
Gast #2219856
Lesenswert?

Danke soweit schonmal. Aber ich brauche dann auch noch Dividierer, 
Wurzel ziehen und Expotentialfunktionen. Ist das alles so zu lösen?

Wohin könnte ich mich mit meinem eigentlich Problem melden? Weil auf 
unserem Uniserver funktioniert das Simulieren der Komponenten. Aber da 
habe ich erstens einen Virtex2p dran und VirSIM, was ich beides lokal 
nicht haben. Es muss also irgendwie gehen.

Danke nochmal.
Gast #2219867
Lesenswert?

Michael Burger schrieb:
> Aber ich brauche dann auch noch Dividierer,
> Wurzel ziehen und Expotentialfunktionen. Ist das alles so zu lösen?
Für Division und Wurzelziehen habe ich State-Machines, die ich aber 
nicht rausgeben darf.

Was willst Du denn machen? Eventuell läßt sich Deine Rechnung 
vereinfachen (Division mit Zweierpotenzen geht z.B.). Wie schnell muß 
das alles gehen?
Bei vielen Berechnungen kannst Du wählen zwischen Ressourcenverbauch und 
Rechengeschwindigkeit.

Duke
Gast #2224343
Lesenswert?

Es wird ein Raytracer in Geometrischer Algebra für Dreicksnetze. Die 
Berechnungen lassen sich nicht weiter vereinfachen. Die Division ist zum 
Normalisieren der 5D konformen Punkte. Es wird daher auch durch andere 
Werte geteilt als Zweierpotenzen, somit muss richtig dividert werden. 
Die Wurzel ist zum Normalisieren der Richtungsvektoren, somit auch nicht 
zu ändern und die Expotentialfunktion wird beim 
Blinn-Phong-Beleuchtungsmodell für den spekularen Anteil gebraucht. 
Ebenfalls nicht zu entfernen.

Habe jetzt auch schon im offiziellen Xilinxforum um Hilfe gefragt. Seit 
4 Tagen no reply :(
Gast #2225712
Lesenswert?

Michael Burger schrieb:
> Es wird daher auch durch andere
> Werte geteilt als Zweierpotenzen, somit muss richtig dividert werden.
> Die Wurzel ist zum Normalisieren der Richtungsvektoren, somit auch nicht
> zu ändern und die Expotentialfunktion wird beim
> Blinn-Phong-Beleuchtungsmodell für den spekularen Anteil gebraucht.
> Ebenfalls nicht zu entfernen.
Alles klar, da brauchst Du richtige Recheneinheiten, keine abgespeckten.

Welche Bitbreite haben Deine Vektoren?
Wie schnell müssen die Berechnungen laufen?
Meine Division benötigt 1 Takt pro Bit und die Wurzelberechnung ca. 1.5 
Takte pro Bit.
Wieviel Platz hast Du dafür?
Wieviele Berechnungen müssen davon parallel ablaufen?

Alternativ könntest Du Dir auch den CORDIC-Algorithmus anschauen. Damit 
sollten sich alle Deine Berechnungen lösen lassen.

Duke
Gast #2232468
Lesenswert?

Den Cordic habe ich ja auch schon im Auge.

Der Algorithmus selbst ist noch in Strahlenerzeugung, Schnittest und 
Schnittpunktberechnung geteilt, mit Fokus auf dem Schnittest. Hier 
laufen 5 Multiplikationen gleichzeitig, weil die Geometrische Algebra 
dies ermöglicht. Sonst wird hier nur + und - sowie Vergleiche gebraucht.

Meine Vektoren sind allesamt 32bit breit. Ich arbeite mit einem selbst 
erstellten Fixpunkttyp, wobei nur 4 bits für vor dem Komma und 28 für 
hintendran zur Verfügung stehen (da vor dem Komma 
implementierungsbedingt max. -1 und +1 stehen kann). Beim 
Multiplikationen "biege" ich durch Shifts das Komma wieder an die 
richtige Stelle und schneide den Rest ab. Die entstehenden 
Rundungsfehler kann der Algorithmus abpuffern.
Gast #2233691
Lesenswert?

@Duke
Da es eigentlich nur ein Teil, eines Teils, meiner Masterarbeit ist, 
sollte es über fertige Cores laufen, da sonst jeglicher Aufwandsrahmen 
gesprengt wird.

@Rene D
Auf dem Spartan3 teste ich nur einzelne Module mit ausgewählten 
Dreiecken und Strahlen, so dass mir seine Größe reicht. Das eigentlich 
Projekt läuft auf einem Virtex 2 an der Uni mit Unterstützung einer 
dedizierten CPU und einem Linuxbetriebssystem. Dort stürzt das Projekt 
allerdings stehts beim starten des Linux auf dem Board ab und ich 
versuche jetzt durch diese Einzeltests rauszufinden, wo genau es hängt.
(Firma: www.dossmatik.de) #2233781
Lesenswert?

D. I. schrieb:
> Wie soll man CORDIC denn sonst vernünftig machen wenn nicht mit
> Fixpunkt?
>
> Mit Floating-Point ist das ja ewiges rumgekrüppel

Richtig.



Ich glaube Cordic hätte hier einen richtigen Einsatz.

Es sind auf direktem Weg die Funktionen

y=K*sqrt(x^2+y^2)
y=K*e^z=K(sinh(z)+cosh(z))

berechenbar.

K ist ein fester Faktor und ist nur abhängig wie oft die Iteration 
ausgeführt wird.

Bisher habe ich nur Sinus und Cosinus mit dem Cordic berechnet. Doch das 
gibt der Algorithmus mit anderen Startparameteren und 
Entscheidungskriterien beim Drehen auch her.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren