Όπως και στα προηγούμενα εργαστήρια συνεχίζουμε στο περιβάλλον του online chisel bootcamp.
Πριν ξεκινήσετε, εκτελέστε τα επόμενα 2 κελιά:
val path = System.getProperty("user.dir") + "/source/load-ivy.sc"
interp.load.module(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath(path)))
import chisel3._
import chisel3.util._
import chisel3.tester._
import chisel3.tester.RawTester.test
import dotvisualizer._
Ζητούμενο είναι η κατασκευή ενός register file για χρήση σε μια μονάδα επεξεργασίας. Επειδή το register file θα τροφοδοτεί και τις δύο εισόδους της αριθμητικής-λογικής μονάδας, θα πρέπει το register file να διαθέτει δύο εξόδους A και B όπου θα εμφανίζονται οι τιμές των επιλεγμένων καταχωρητών (αντί για μία έξοδο, όπως υλοποιήσατε στο προηγούμενο εργαστήριο).
Χρησιμοποιώντας υλικό από τα προηγούμενα εργαστήρια κατασκευάστε register file (module RegisterFile
) με τα εξής χαρακτηριστικά:
Το module RegisterFile
θα ορίζεται παραμετρικά τόσο για το πλήθος των καταχωρητών (παράμετρος register_number
), όσο και για το εύρος λέξης των καταχωρητών (παράμετρος register_width
). Το module σας θα πρέπει δηλαδή να ορίζεται ως εξής:
class RegisterFile(register_number: Int, register_width: Int) extends Module {
Οι είσοδοι και έξοδοι του module RegisterFile
θα πρέπει να είναι οι ακόλουθες:
in
: λέξη εισόδου (για εγγραφή) στο register file, με εύρος register_width
bits.out_a
: έξοδος A από το register file, με εύρος register_width
bits.out_b
: έξοδος B από το register file, με εύρος register_width
bits.read_sel_a
: είσοδος, επιλέγει ποιου καταχωρητή το περιεχόμενο θα εμφανιστεί στην έξοδο A (out_a
), με εύρος log2Ceil(register_number)
bits.read_sel_b
: είσοδος, επιλέγει ποιου καταχωρητή το περιεχόμενο θα εμφανιστεί στην έξοδο B (out_b
), με εύρος log2Ceil(register_number)
bits.write_sel
: είσοδος, επιλέγει σε ποιον καταχωρητή θα αποθηκευτεί η λέξη εισόδου in
, με εύρος log2Ceil(register_number)
bits.Όλοι οι καταχωρητές κατά την έναρξη λειτουργίας θα πρέπει να αρχικοποιούνται στην τιμή 0.
Ο καταχωρητής 0 δεν είναι εγγράψιμος και παραμένει πάντα 0 κατά την ανάγνωση.
class RegisterFile(register_number: Int, register_width: Int) extends Module {
val io = IO(new Bundle {
// συμπληρώστε τις εισόδους/εξόδους..
})
// συμπληρώστε...
}
Προσθέστε τον δικό σας κώδικα ελέγχου (δείτε τον αντίστοιχο κώδικα από το προηγούμενο εργαστήριο) που θα δημιουργεί και θα ελέγχει ένα register file με 8 καταχωρητές και εύρος λέξης 16 bits για να βεβαιωθείτε ότι:
Μπορείτε να θέσετε μια διαφορετική τιμή σε κάθε καταχωρητή (εκτός από τον καταχωρητή 0).
Θέτοντας την κατάλληλη τιμή στα σήματα επιλογής καταχωρητή, μπορείτε να διαβάσετε από τις εξόδους Α και Β τις τιμές που γράψατε προηγουμένως.
test(new RegisterFile(..συμπληρώστε τις παραμέτρους..)) { c =>
// ..συμπληρώστε..
}
println("SUCCESS!!")
Ανεβάστε το τελικό σας notebook στο opencourses (Εργασία 2) έως και τη Δευτέρα 25/11.
(Ίσως χρειαστεί να κάνετε zip το αρχείο ipynb για να γίνει αποδεκτό από το σύστημα)