replace verilog clock divider with one written in Chisel
This commit is contained in:
		| @@ -4,6 +4,7 @@ package uncore.tilelink2 | |||||||
| import Chisel._ | import Chisel._ | ||||||
| import chisel3.util.LFSR16 | import chisel3.util.LFSR16 | ||||||
| import unittest._ | import unittest._ | ||||||
|  | import util.Pow2ClockDivider | ||||||
|  |  | ||||||
| class IDMapGenerator(numIds: Int) extends Module { | class IDMapGenerator(numIds: Int) extends Module { | ||||||
|   val w = log2Up(numIds) |   val w = log2Up(numIds) | ||||||
| @@ -208,15 +209,6 @@ class TLFuzzer( | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| class ClockDivider extends BlackBox { |  | ||||||
|   val io = new Bundle { |  | ||||||
|     val clock_in  = Clock(INPUT) |  | ||||||
|     val reset_in  = Bool(INPUT) |  | ||||||
|     val clock_out = Clock(OUTPUT) |  | ||||||
|     val reset_out = Bool(OUTPUT) |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| class TLFuzzRAM extends LazyModule | class TLFuzzRAM extends LazyModule | ||||||
| { | { | ||||||
|   val model = LazyModule(new TLRAMModel) |   val model = LazyModule(new TLRAMModel) | ||||||
| @@ -240,17 +232,14 @@ class TLFuzzRAM extends LazyModule | |||||||
|     io.finished := fuzz.module.io.finished |     io.finished := fuzz.module.io.finished | ||||||
|  |  | ||||||
|     // Shove the RAM into another clock domain |     // Shove the RAM into another clock domain | ||||||
|     val clocks = Module(new ClockDivider) |     val clocks = Module(new Pow2ClockDivider(2)) | ||||||
|     ram.module.clock := clocks.io.clock_out |     ram.module.clock := clocks.io.clock_out | ||||||
|     ram.module.reset := clocks.io.reset_out |  | ||||||
|     clocks.io.clock_in := clock |  | ||||||
|     clocks.io.reset_in := reset |  | ||||||
|  |  | ||||||
|     // ... and safely cross TL2 into it |     // ... and safely cross TL2 into it | ||||||
|     cross.module.io.in_clock := clock |     cross.module.io.in_clock := clock | ||||||
|     cross.module.io.in_reset := reset |     cross.module.io.in_reset := reset | ||||||
|     cross.module.io.out_clock := clocks.io.clock_out |     cross.module.io.out_clock := clocks.io.clock_out | ||||||
|     cross.module.io.out_reset := clocks.io.reset_out |     cross.module.io.out_reset := reset | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| package uncore.tilelink2 | package uncore.tilelink2 | ||||||
|  |  | ||||||
| import Chisel._ | import Chisel._ | ||||||
|  | import util.Pow2ClockDivider | ||||||
|  |  | ||||||
| object LFSR16Seed | object LFSR16Seed | ||||||
| { | { | ||||||
| @@ -225,9 +226,7 @@ trait RRTest1Bundle | |||||||
|  |  | ||||||
| trait RRTest1Module extends Module with HasRegMap | trait RRTest1Module extends Module with HasRegMap | ||||||
| { | { | ||||||
|   val clocks = Module(new ClockDivider) |   val clocks = Module(new Pow2ClockDivider(2)) | ||||||
|   clocks.io.clock_in := clock |  | ||||||
|   clocks.io.reset_in := reset |  | ||||||
|  |  | ||||||
|   def x(bits: Int) = { |   def x(bits: Int) = { | ||||||
|     val field = UInt(width = bits) |     val field = UInt(width = bits) | ||||||
| @@ -237,7 +236,7 @@ trait RRTest1Module extends Module with HasRegMap | |||||||
|     readCross.io.master_reset := reset |     readCross.io.master_reset := reset | ||||||
|     readCross.io.master_allow := Bool(true) |     readCross.io.master_allow := Bool(true) | ||||||
|     readCross.io.slave_clock := clocks.io.clock_out |     readCross.io.slave_clock := clocks.io.clock_out | ||||||
|     readCross.io.slave_reset := clocks.io.reset_out |     readCross.io.slave_reset := reset | ||||||
|     readCross.io.slave_allow := Bool(true) |     readCross.io.slave_allow := Bool(true) | ||||||
|  |  | ||||||
|     val writeCross = Module(new RegisterWriteCrossing(field)) |     val writeCross = Module(new RegisterWriteCrossing(field)) | ||||||
| @@ -245,7 +244,7 @@ trait RRTest1Module extends Module with HasRegMap | |||||||
|     writeCross.io.master_reset := reset |     writeCross.io.master_reset := reset | ||||||
|     writeCross.io.master_allow := Bool(true) |     writeCross.io.master_allow := Bool(true) | ||||||
|     writeCross.io.slave_clock := clocks.io.clock_out |     writeCross.io.slave_clock := clocks.io.clock_out | ||||||
|     writeCross.io.slave_reset := clocks.io.reset_out |     writeCross.io.slave_reset := reset | ||||||
|     writeCross.io.slave_allow := Bool(true) |     writeCross.io.slave_allow := Bool(true) | ||||||
|  |  | ||||||
|     readCross.io.slave_register := writeCross.io.slave_register |     readCross.io.slave_register := writeCross.io.slave_register | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								src/main/scala/util/ClockDivider.scala
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/main/scala/util/ClockDivider.scala
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | package util | ||||||
|  |  | ||||||
|  | import Chisel._ | ||||||
|  |  | ||||||
|  | /** Divide the clock by 2 */ | ||||||
|  | class ClockDivider2 extends Module { | ||||||
|  |   val io = new Bundle { | ||||||
|  |     val clock_out = Clock(OUTPUT) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   val clock_reg = Reg(Bool()) | ||||||
|  |   clock_reg := !clock_reg | ||||||
|  |  | ||||||
|  |   io.clock_out := clock_reg.asClock | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** Divide the clock by power of 2 times. | ||||||
|  |  *  @param pow2 divides the clock 2 ^ pow2 times | ||||||
|  |  *  WARNING: This is meant for simulation use only. */ | ||||||
|  | class Pow2ClockDivider(pow2: Int) extends Module { | ||||||
|  |   val io = new Bundle { | ||||||
|  |     val clock_out = Clock(OUTPUT) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (pow2 == 0) { | ||||||
|  |     io.clock_out := clock | ||||||
|  |   } else { | ||||||
|  |     val dividers = Seq.fill(pow2) { Module(new ClockDivider2) } | ||||||
|  |  | ||||||
|  |     dividers.init.zip(dividers.tail).map { case (last, next) => | ||||||
|  |       next.clock := last.io.clock_out | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     io.clock_out := dividers.last.io.clock_out | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -9,7 +9,6 @@ bb_vsrcs = $(base_dir)/vsrc/DebugTransportModuleJtag.v \ | |||||||
| 	$(base_dir)/vsrc/AsyncMailbox.v \ | 	$(base_dir)/vsrc/AsyncMailbox.v \ | ||||||
| 	$(base_dir)/vsrc/AsyncResetReg.v \ | 	$(base_dir)/vsrc/AsyncResetReg.v \ | ||||||
| 	$(base_dir)/vsrc/AsyncSetReg.v \ | 	$(base_dir)/vsrc/AsyncSetReg.v \ | ||||||
| 	$(base_dir)/vsrc/ClockDivider.v \ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| sim_vsrcs = \ | sim_vsrcs = \ | ||||||
|   | |||||||
| @@ -1,19 +0,0 @@ | |||||||
| // You can't divide clocks in Chisel |  | ||||||
| module ClockDivider( |  | ||||||
|   input  clock_in, |  | ||||||
|   input  reset_in, |  | ||||||
|   output clock_out, |  | ||||||
|   output reset_out |  | ||||||
| ); |  | ||||||
|  |  | ||||||
|   reg [2:0] shift = 3'b001; |  | ||||||
|  |  | ||||||
|   always @(posedge clock_in) |  | ||||||
|   begin |  | ||||||
|     shift <= {shift[0], shift[2:1]}; |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   assign reset_out = reset_in; |  | ||||||
|   assign clock_out = shift[0]; |  | ||||||
|  |  | ||||||
| endmodule |  | ||||||
		Reference in New Issue
	
	Block a user