Forum: FPGA, VHDL & Co. Programmer : Verilog -> 0 : 1 ich verlier irgendwie.


von Adrian W. (koffeiniker)


Lesenswert?

Das Problem:

ich will ein minimales memory management bauen. Dazu brauche ich ein 
Register welches ich vom Datenbus lesen und schreiben kann und welches 
seinen Wert tristate auf den Adressbus bzw. einiges Bits desselben 
packt.

Also baue ich dieses Modul:
1
`timescale 1ns / 1ps
2
3
module Register(
4
    inout [7:0] d,
5
    output [3:0] o,
6
    input rd,
7
    input wr,
8
    input cs,
9
    input enable,
10
   input res
11
    );
12
13
  reg [7:0] store;              // This register is holding the value.
14
15
  wire write;
16
  assign write = !cs & !wr;
17
  wire read;
18
  assign read = !cs & !rd;
19
  wire reset;
20
  assign reset = res;
21
  
22
  assign int_enable = enable;
23
  bufif1(o, store[3:0], int_enable);  // Define the tristate output for the banker
24
25
  // assign d = store;              // Read will always be assigned, but the tristate will control the output
26
  
27
  
28
  // Implement Read
29
  //
30
  bufif1(d, store, read);          // Define the tristate output for the read
31
  
32
  
33
  // Setup
34
  //
35
  initial
36
    begin
37
      store <= 8'h00;
38
    end
39
    
40
    
41
    
42
  // Implement reset
43
  //
44
  // reset is inverted, we act on the end of the reset-cycle.
45
  //
46
  always @(posedge reset)
47
    begin
48
      store[0] <= reset;          // Attempt to make the synthesizer shut up about warning 646.
49
      store <= 8'h00;
50
    end
51
    
52
    
53
  // Implement write
54
  // - cs will be low and ...
55
  //  - wr will become low
56
  //
57
  always @(posedge write)
58
    begin
59
      store[7:0] <= d[7:0];
60
    end
61
62
63
endmodule

Ich würde denken dass der initial den store initialisiert (was sicher 
auch anders ginge) und die always Blöcke je nach Änderung des Status den 
store ändern: die Signale für read und write sind denen üblicher SRAMs 
6264 oder so nachempfunden /CS, /RD, /WR (ist für alte Z80 CPUs).

Was ich glaube, gebaut zu haben ;-):

 - Lesen geht einfach über den bufif1 für den Datenbus. Wenn read 1 
wird, schaltet der bufif1 den store-Wert auf den Datenbus.
 - Schreiben geht über den always @(posedge write): wenn cs==0 und wr==0 
folgt write wird positiv. Auf dessen posedge wird dann der store-Wert 
vom Datenbus gesetzt.
 - Reset sollte am Ende des Reset-Zyklus also auf der posedge den store 
auf 0 setzen.

Eigentlich sollte das alles ganz einfach sein. Ist wohl eine 
Fehlannahme.

Als "main()", hust Top-Level-Module dienst erstmal ein Test:
1
`timescale 1ns / 1ps
2
`include "Register.v"
3
4
module Core (inout d, output [3:0] aout, input rd, input wr, input enable, input cs, input res);
5
6
  Register area_a(
7
    .d(d), 
8
    .o(aout), 
9
    .rd(rd), 
10
    .wr(wr), 
11
    .cs(cs), 
12
    .enable(enable), 
13
    .res(res)
14
  );
15
16
endmodule

Schick ich dass durch den Xilinx Webpack (und grad hab ich nix anderes), 
bekomme ich:
1
INFO:Xst:2679 - Register <store<0>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.

Und das für jede bit in store. Nun frag ich mich, was mach ich falsch. 
Hab schon versucht die Zuweisungen mit = statt mit <= zu machen: kein 
Effekt.

Beim Reset hatte ich mich schon gebissen, weil ISE meinte der würde 
nicht benutzt obwohl der in der aways-@ Bedingung verwendet wurde.

Ich hab irgendwie den Verdacht ich habe einen globalen Denkfehler 
gemacht und suche im Kreis ... also bitte ich um Eure Hilfe ... und 
Nachsicht, wenn es ein echter Penner-Fehler sein sollte. Vermutlich bin 
ich als C/C++/TCL/sonstwas Programmier auf irgendeinen generellen 
Unterschied zwischen Digital-Design und Programmierung reingefallen?!?

Vielen Dank im Voraus!

Adrian, koffeiniker



Hier das ganze log vom Webpack:
1
Started : "Synthesize - XST".
2
Running xst...
3
Command Line: xst -intstyle ise -ifn "C:/Xilinx Projects/CPLDBankswitcher/Core.xst" -ofn "C:/Xilinx Projects/CPLDBankswitcher/Core.syr"
4
Reading design: Core.prj
5
6
=========================================================================
7
*                          HDL Compilation                              *
8
=========================================================================
9
Compiling verilog file "Core.v" in library work
10
Compiling verilog include file "Register.v"
11
Module <Register> compiled
12
Module <Core> compiled
13
No errors in compilation
14
Analysis of file <"Core.prj"> succeeded.
15
 
16
17
=========================================================================
18
*                     Design Hierarchy Analysis                         *
19
=========================================================================
20
Analyzing hierarchy for module <Core> in library <work>.
21
22
Analyzing hierarchy for module <Register> in library <work>.
23
24
25
=========================================================================
26
*                            HDL Analysis                               *
27
=========================================================================
28
Analyzing top module <Core>.
29
Module <Core> is correct for synthesis.
30
 
31
Analyzing module <Register> in library <work>.
32
Module <Register> is correct for synthesis.
33
 
34
35
=========================================================================
36
*                           HDL Synthesis                               *
37
=========================================================================
38
39
Performing bidirectional port resolution...
40
INFO:Xst:2679 - Register <store<0>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.
41
INFO:Xst:2679 - Register <store<7>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.
42
INFO:Xst:2679 - Register <store<6>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.
43
INFO:Xst:2679 - Register <store<5>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.
44
INFO:Xst:2679 - Register <store<4>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.
45
INFO:Xst:2679 - Register <store<3>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.
46
INFO:Xst:2679 - Register <store<2>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.
47
INFO:Xst:2679 - Register <store<1>> in unit <Register> has a constant value of 0 during circuit operation. The register is replaced by logic.
48
49
Synthesizing Unit <Register>.
50
    Related source file is "Register.v".
51
    Found 8-bit tristate buffer for signal <d>.
52
    Found 4-bit tristate buffer for signal <o>.
53
    Found 8-bit register for signal <store>.
54
    Summary:
55
  inferred   8 D-type flip-flop(s).
56
  inferred  12 Tristate(s).
57
Unit <Register> synthesized.
58
59
60
Synthesizing Unit <Core>.
61
    Related source file is "Core.v".
62
Unit <Core> synthesized.
63
64
65
=========================================================================
66
HDL Synthesis Report
67
68
Macro Statistics
69
# Registers                                            : 8
70
 1-bit register                                        : 8
71
# Tristates                                            : 2
72
 4-bit tristate buffer                                 : 1
73
 8-bit tristate buffer                                 : 1
74
75
=========================================================================
76
77
=========================================================================
78
*                       Advanced HDL Synthesis                          *
79
=========================================================================
80
81
82
=========================================================================
83
Advanced HDL Synthesis Report
84
85
Macro Statistics
86
# Registers                                            : 8
87
 Flip-Flops                                            : 8
88
89
=========================================================================
90
91
=========================================================================
92
*                         Low Level Synthesis                           *
93
=========================================================================
94
95
ERROR:Xst:528 - Multi-source in Unit <Register> on signal <store<7>>; this signal is connected to multiple drivers.
96
Drivers are: 
97
   Output signal of FD instance <area_a/store_7>
98
   Signal <area_a/store<7>> in Unit <Register> is assigned to GND
99
100
ERROR:Xst:528 - Multi-source in Unit <Register> on signal <store<6>>; this signal is connected to multiple drivers.
101
Drivers are: 
102
   Output signal of FD instance <area_a/store_6>
103
   Signal <area_a/store<6>> in Unit <Register> is assigned to GND
104
105
ERROR:Xst:528 - Multi-source in Unit <Register> on signal <store<5>>; this signal is connected to multiple drivers.
106
Drivers are: 
107
   Output signal of FD instance <area_a/store_5>
108
   Signal <area_a/store<5>> in Unit <Register> is assigned to GND
109
110
ERROR:Xst:528 - Multi-source in Unit <Register> on signal <store<4>>; this signal is connected to multiple drivers.
111
Drivers are: 
112
   Output signal of FD instance <area_a/store_4>
113
   Signal <area_a/store<4>> in Unit <Register> is assigned to GND
114
115
ERROR:Xst:528 - Multi-source in Unit <Register> on signal <store<3>>; this signal is connected to multiple drivers.
116
Drivers are: 
117
   Output signal of FD instance <area_a/store_3>
118
   Signal <area_a/store<3>> in Unit <Register> is assigned to GND
119
120
ERROR:Xst:528 - Multi-source in Unit <Register> on signal <store<2>>; this signal is connected to multiple drivers.
121
Drivers are: 
122
   Output signal of FD instance <area_a/store_2>
123
   Signal <area_a/store<2>> in Unit <Register> is assigned to GND
124
125
ERROR:Xst:528 - Multi-source in Unit <Register> on signal <store<1>>; this signal is connected to multiple drivers.
126
Drivers are: 
127
   Output signal of FD instance <area_a/store_1>
128
   Signal <area_a/store<1>> in Unit <Register> is assigned to GND
129
130
ERROR:Xst:528 - Multi-source in Unit <Register> on signal <store<0>>; this signal is connected to multiple drivers.
131
Drivers are: 
132
   Output signal of FD instance <area_a/store_0>
133
   Signal <area_a/store<0>> in Unit <Register> is assigned to GND
134
135
136
Total REAL time to Xst completion: 4.00 secs
137
Total CPU time to Xst completion: 4.44 secs
138
 
139
--> 
140
141
Total memory usage is 142376 kilobytes
142
143
Number of errors   :    8 (   0 filtered)
144
Number of warnings :    1 (   0 filtered)
145
Number of infos    :    8 (   0 filtered)
146
147
148
Process "Synthesize - XST" failed

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dein eigentliches Problem sind diese "Multi Source" Fehler: du treibst 
von mehreren Stellen auf das Signal store.

von Adrian W. (koffeiniker)


Lesenswert?

Hmm, ich war davonb ausgegangen dass das Folgefehler sind.

Wenn ISE das Reg durch Logik ersetzt, also GND aufschaltet, bekomm ich 
dadurch eine neue zusätzliche Quelle. Wenn nun D wie gewünscht beim 
Write Daten da reinschiebt, hab ich den 2.

Also warum haut der ISE GND auf den Store?

Adrian

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Folgefehler
Das sind die einzigen Fehler. Das mit dem wegoptimierten Signal sind 
nicht mal Warnungen, sondern sogar nur Infos.

Mir fällt auf, dass in deinem Design nirgendwo ein 'Z' vorkommt: ein 
"normaler" Baustein muss seine Datenleitungen hochohmig schalten, wenn 
er beschrieben werden soll.

> Also warum haut der ISE GND auf den Store?
Weil das Signal mit dem Defaultwert 0 initialisiert wird, und wegen der 
Multisource später keinen anderen Wert mehr annehmen kann.

von Holger H. (holger-h-hennef) Benutzerseite


Angehängte Dateien:

Lesenswert?

Adrian Wallaschek schrieb:
> Das Problem:
>
>
>
> ich will ein minimales memory management bauen. Dazu brauche ich ein
>
> Register welches ich vom Datenbus lesen und schreiben kann und welches
>
> seinen Wert tristate auf den Adressbus bzw. einiges Bits desselben
>
> packt.


@Adrian
Anhang: VERILOG_COND_TRISTATE.PNG
Das ist ein Muster in Verilog für conditional
Tristate.
Gruss Holger.

von Pille (Gast)


Lesenswert?

Was soll dieses kindische rumgekritzel im Quellcode?

von ich (Gast)


Lesenswert?

Um das nochmal deutlich zu machen, das ist dein Problem:
1
  initial
2
    begin
3
      store <= 8'h00;
4
  end
5
6
  always @(posedge reset)
7
    begin
8
      store[0] <= reset;
9
      store <= 8'h00;
10
    end
11
    
12
  always @(posedge write)
13
    begin
14
      store[7:0] <= d[7:0];
15
    end


Mach das vernünftig.
- initial ist nicht synthetisierbar, weg damit!
- arbeitest du absichtlich ohne Takt?
- Eine Zuweisung!
1
  always @(posedge reset or posedge write)
2
    begin
3
      if (reset)
4
        begin
5
          store <= 8'h00;
6
        end
7
      else if (write)
8
         begin    
9
           store[7:0] <= d[7:0];
10
         end
11
     end

Wenn du wirklich mit Tristate arbeiten willst, musst du am Output noch 
einen Mux einbauen, der entweder d oder 'z' durchschaltet, wie oben von 
Holger gezeigt.
Überlege dir aber nochmal genau, ob du mit Tristate arbeiten musst und 
ob du wirklich ohne Takt arbeiten willst.

von Adrian W. (koffeiniker)


Lesenswert?

Hmm ich erinner mich, im Verilog Buch war initial auch zerissen worden.

Ich setz das alles mal um und melde mich ob ich Fortschritte mache.

Was den tristate betrifft ... ich hatte die Illusion das bufif1 das 
schon machen würde.

Ich mach das mal von Hand.

Gruß
Adrian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.