ich habe schon damals in der Übung 2.2.2 damit gekämpft und nachdem das jetzt auch in den Beispielaufgaben als 3d auftaucht, bin ich endgültig daran verzweifelt.
Das Problem ist folgendes:
Man will ein Bluespec-Modul haben, welches einen Zähler realisiert, dessen Zählerstand man im selben Takt schreiben und lesen kann. An sich lässt sich das mit RWires oder CRegs realisieren, allerdings habe ich eine solche Variante noch nie erfolgreich kompiliert bekommen bzw. es gab Warnungen wegen Konflikten und die gewünschte Semantik lag nicht vor.
Als ``minimum failing example'' habe ich folgendes geschrieben: http://pastebin.com/GhdTynCn.
Darin ist kein Reset/Load implementiert und der Test ist sehr einfach aufgebaut. Des weiteren habe ich Zähler auslesen und Register aktualisieren in eine Method geschrieben, um Konflikte zwischen dem Auslesen und Aktualisieren zu vermeiden.
Jetzt sagt der Compiler folgendes
Code: Alles auswählen
TU clientssh3:~/wd/cms/beispeilaufgaben$ make
bsc -sim -g mkTrivialTest -u TestTrivial.bsv
checking package dependencies
compiling TestTrivial.bsv
code generation for mkTrivialTest starts
Error: "TestTrivial.bsv", line 53, column 33: (G0004)
Rule `RL_action_l53c33' uses methods that conflict in parallel:
tc_ival.port0__write(...)
and
tc_ival.port1__read()
For the complete expressions use the flag `-show-range-conflict'.
Error: "TestTrivial.bsv", line 58, column 33: (G0004)
Rule `RL_action_l58c33' uses methods that conflict in parallel:
tc_ival.port0__write(...)
and
tc_ival.port1__read()
For the complete expressions use the flag `-show-range-conflict'.
Error: "TestTrivial.bsv", line 58, column 33: (G0004)
Rule `RL_action_l58c33' uses methods that conflict in parallel:
tc_dval.port0__write(...)
and
tc_dval.port1__read()
For the complete expressions use the flag `-show-range-conflict'.
Elaborated error module file created: mkTrivialTest.ba
make: *** [trivial] Error 1
Ich vermute, dass man den Konflikt auflösen könnte, wenn man explizit ``write before read'' formalisieren können. Allerdings unterstüzt der `bsc` auf dem Poolrechner keine Scheduling Attributes für Methoden und ich konnte online nichtmal eine Testversion von einem neueren BSC finden, also nicht überprüfen, ob man damit das Problem angehen könnte.
Hat jemand es geschafft einen Zähler mit Concurrent Add + Read (wobei Lesen das NEUE Ergebnis zurückgibt) zu implementieren und ist bereit, sein Wissen zu teilen?
Edit: Erst schreiben, dann Lesen
