finish writing, ready to debug

This commit is contained in:
2024-07-31 15:19:00 +00:00
parent 39f7468531
commit 90bb66a182
6 changed files with 365 additions and 54 deletions

View File

@ -8,7 +8,7 @@ const static size_t kTotalRegisters = 32;
struct RegisterFile_Input {
// receive control signal from CSU
dark::Wire<1> reset;
dark::Wire<1> force_clear_receiver;
// dark::Wire<1> force_clear_receiver;
dark::Wire<1> is_issuing;
dark::Wire<1> issue_type;
dark::Wire<5> issue_ROB_index;
@ -21,6 +21,7 @@ struct RegisterFile_Input {
dark::Wire<5> decoded_rs2;
dark::Wire<1> has_decoded_rs2;
dark::Wire<1> is_committing;
dark::Wire<1> has_resulting_register;
dark::Wire<5> commit_ins_ROB_index;
dark::Wire<5> commit_reg_index;
dark::Wire<32> commit_reg_value;
@ -44,47 +45,49 @@ struct RegisterFile : public dark::Module<RegisterFile_Input, RegisterFile_Outpu
}
void work() {
if (bool(reset)) {
for(auto& reg : registers) {
for (auto &reg : registers) {
reg <= 0;
}
for(auto& reg : register_deps) {
for (auto &reg : register_deps) {
reg <= 0;
}
for(auto& reg : register_nodep) {
for (auto &reg : register_nodep) {
reg <= 1;
}
return;
}
if(bool(is_committing)) {
registers[static_cast<max_size_t>(commit_reg_index)] <= commit_reg_value;
if(register_deps[static_cast<max_size_t>(commit_reg_index)] == commit_ins_ROB_index) {
register_nodep[static_cast<max_size_t>(commit_reg_index)] <= 1;
if (bool(is_committing)) {
if (bool(has_resulting_register)) {
registers[static_cast<max_size_t>(commit_reg_index)] <= commit_reg_value;
if (register_deps[static_cast<max_size_t>(commit_reg_index)] == commit_ins_ROB_index) {
register_nodep[static_cast<max_size_t>(commit_reg_index)] <= 1;
}
}
}
if(bool(is_issuing)) {
if(bool(has_decoded_rs1)) {
if((!bool(is_committing))||(commit_reg_index != decoded_rs1)) {
rs1_deps <= register_deps[static_cast<max_size_t>(decoded_rs1)];
rs1_value <= registers[static_cast<max_size_t>(decoded_rs1)];
rs1_nodep <= register_nodep[static_cast<max_size_t>(decoded_rs1)];
if (bool(is_issuing)) {
if (bool(has_decoded_rs1)) {
if ((!bool(is_committing)) || (commit_reg_index != decoded_rs1)) {
rs1_deps <= register_deps[static_cast<max_size_t>(decoded_rs1)].peek();
rs1_value <= registers[static_cast<max_size_t>(decoded_rs1)].peek();
rs1_nodep <= register_nodep[static_cast<max_size_t>(decoded_rs1)].peek();
} else {
rs1_deps <= 0;
rs1_value <= commit_reg_value;
rs1_nodep <= 1;
}
}
if(bool(has_decoded_rs2)) {
if((!bool(is_committing))||(commit_reg_index != decoded_rs2)) {
rs2_deps <= register_deps[static_cast<max_size_t>(decoded_rs2)];
rs2_value <= registers[static_cast<max_size_t>(decoded_rs2)];
rs2_nodep <= register_nodep[static_cast<max_size_t>(decoded_rs2)];
if (bool(has_decoded_rs2)) {
if ((!bool(is_committing)) || (commit_reg_index != decoded_rs2)) {
rs2_deps <= register_deps[static_cast<max_size_t>(decoded_rs2)].peek();
rs2_value <= registers[static_cast<max_size_t>(decoded_rs2)].peek();
rs2_nodep <= register_nodep[static_cast<max_size_t>(decoded_rs2)].peek();
} else {
rs2_deps <= 0;
rs2_value <= commit_reg_value;
rs2_nodep <= 1;
}
}
if(bool(has_decoded_rd)) {
if (bool(has_decoded_rd)) {
register_deps[static_cast<max_size_t>(decoded_rd)] <= static_cast<max_size_t>(issue_ROB_index);
register_nodep[static_cast<max_size_t>(decoded_rd)] <= 0;
}