Zum Beispiel betrachten die folgenden Verilog Eingang (test.v
):
module test(input [7:0] val1, val2, output [7:0] temp);
assign temp = 16*val1 + 8*val2;
endmodule
Der Befehl yosys -p 'prep; opt -full; show' test.v
die folgende Schaltbild erzeugen wird:
und die Ausgabe an die Konsole geschrieben enthält diese :
3.1. Executing OPT_EXPR pass (perform const folding).
Replacing multiply-by-16 cell `$mul$test.v:2$1' in module `\test' with shift-by-4.
Replacing multiply-by-8 cell `$mul$test.v:2$2' in module `\test' with shift-by-3.
Replacing $shl cell `$mul$test.v:2$1' (B=3'100, SHR=-4) in module `test' with fixed wiring: { \val1 [3:0] 4'0000 }
Replacing $shl cell `$mul$test.v:2$2' (B=2'11, SHR=-3) in module `test' with fixed wiring: { \val2 [4:0] 3'000 }
Die zwei Zeilen, die Replacing multiply-by-* cell
lesen, sind die Transformation, die Sie erwähnten. Die beiden folgenden Zeilen ersetzen die Konstantverschiebungsoperationen durch Verdrahtung, wobei {val1[3:0], 4'b0000}
und {val2[4:0], 3'b000}
als Eingänge für den Addierer verwendet werden.
Dies wird in der opt_expr
bestanden. Siehe passes/opt/opt_expr.cc
für seinen Quellcode, um zu sehen, wie es gemacht wird.