riscv-bluespec-classic/src/ClkDivider.bsv
2023-09-25 02:45:27 -04:00

41 lines
960 B
Plaintext

package ClkDivider;
export mkClkDivider;
export ClkDivider(..);
interface ClkDivider#(numeric type hi);
method Action reset();
method Bool isAdvancing();
method Bool isHalfCycle();
endinterface
module mkClkDivider#(Handle fileHandle)(ClkDivider#(hi));
Reg#(UInt#(TLog#(hi))) counter <- mkReg(0);
UInt#(TLog#(hi)) hi_value = fromInteger(valueOf(hi));
UInt#(TLog#(hi)) half_hi_value = fromInteger(valueOf(TDiv#(hi, 2)));
Real val = fromInteger(valueOf(hi));
let msg = "Clock Div Period : " + realToString(val) + "\n";
hPutStr(fileHandle, msg);
hPutStr(fileHandle, genModuleName);
rule tick;
$display(counter);
counter <= (counter == hi_value) ? 0 : counter + 1;
endrule
method Action reset();
counter <= 0;
endmethod
method Bool isAdvancing();
return (counter == hi_value);
endmethod
method Bool isHalfCycle();
return (counter == half_hi_value);
endmethod
endmodule
endpackage