Verilog: Vereinfachung von Auswertung parameter?

Gast #6013455
Lesenswert?

Hi!

Kann man sowas in Verilog einfacher schreiben?

Präziser: Geht da irgendwas mit `define um die Negierung bei der 
Zuweisung automagisch einzusetzen?
Oder irgendwas anderes kompaktes? Den code zu kopieren erscheint mir 
nicht sinnvoll.

Ich stell mir was in der Richtung vor:
1
4'h0: segments[6:0] = `negate 7'b0000110;
Allerding soll das 'negate' nur lokal sein.

Beispiel:
1
module HexToSeg #(parameter activeHigh = 1) (
2
  input wire [3:0] hex,
3
  output reg [6:0] segments
4
)
5

6
  always @* begin
7
    if (activeHigh) begin
8
      case (hex)
9
        4'h0: segments[6:0] = 7'b0000110;
10
        ...
11
      endcase
12
    end
13
    else begin
14
      case (hex)
15
        4'h0: segments[6:0] = ~7'b0000110;
16
        ...
17
      endcase
18
    end
19
  end
20

21
endmodule

Gruß & Dank,
Nick

Wieso gibt es denn kein tag für Verilog-Formatierung, sondern nur für 
VHDL? Das ist ja schrecklich! ;-)
Gast #6013467
Lesenswert?

Mir ist nicht gnaz klar, was du mit "lokalem negate" meinst.

Ich würde das if und den ganzen else-Zweig weglassen und als letztes 
Statement im always-Block schreiben

segments_out[6:0] = activeHigh ? segments[6:0] : ~segments[6:0];

Oder was meinst du?
Gast #6013480
Lesenswert?

Vancouver schrieb:
> Oder was meinst du?

Ah! OK, das ist eine Lösung, an die dachte ich auch mal.
Aber Dein Vorschlag generiert doch im Fall der Negierung zusätzliche 
Gatter, oder?
Gibt es eine Lösung, die bei der Synthese komplett rausoptimiert wird, 
aber ohne das Bitmuster zu wiederholen.

Also so nicht:

4'h0: segments[6:0] = activeHigh ? 7'b0000110 : ~7'b0000110;


Nick
Gast #6013483
Lesenswert?

Nick M. schrieb:
> Aber Dein Vorschlag generiert doch im Fall der Negierung zusätzliche
> Gatter, oder?

Nein, die Synthese erkennt das und passt die Konstanten so an, dass die 
Invertierung wegfällt. Solche Optimierungen auf Gatterbene solltest Du 
wirklich der Synthese überlassen, die macht das besser als es jeder 
Mensch könnte. Das erlaubt es dir, den Code möglichst leicht 
verständlich zu schreiben. Die anschließende Optimierung ist "not your 
Job" :-)
Gast #6013566
Lesenswert?

HA!

Jetzt hab ich die Lösung für mein ursprüngliches Ziel:
1
if (activeHigh)
2
  localparam negate = 7'b0000000;
3
else
4
  localparam negate = 7'b1111111;
5

6
...
7
    4'h0: segments[6:0] = negate ^ 7'b0000110;

Nicht ausprobiert!

Nick
Gast #6013650
Lesenswert?

Ja, so gehts vermutlich auch. kann sein, dass du die 
localparam-Deklaration in eine generate-Umgebung packen musst.

Oder du sagst negate={7{activeHigh}}

Ob das alles die Verständlichkeit deines Sourcecodes fördert, musst du 
selbst entscheiden :-) Die Logik nach der Synthese dürfte aber immer die 
gleiche sein.

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