@@ -497,8 +497,8 @@ class ToEDSpec extends StageSpec(stageCreatesUnrefAnons = true):
497
497
y := x
498
498
499
499
class IDTop extends EDDesign :
500
- val x = SInt (16 ) <> IN
501
- val y = SInt (16 ) <> OUT
500
+ val x = SInt (16 ) <> IN
501
+ val y = SInt (16 ) <> OUT
502
502
val dmn1 = new RTDomain :
503
503
val id = ID ()
504
504
id.x <> x
@@ -558,8 +558,8 @@ class ToEDSpec extends StageSpec(stageCreatesUnrefAnons = true):
558
558
559
559
test(" RT domain with basic combinational if-else" ) {
560
560
class IDTop extends EDDesign :
561
- val x = SInt (16 ) <> IN
562
- val y = SInt (16 ) <> OUT
561
+ val x = SInt (16 ) <> IN
562
+ val y = SInt (16 ) <> OUT
563
563
val dmn1 = new RTDomain :
564
564
if (x < 0 ) y := 0
565
565
else y := x
@@ -609,9 +609,9 @@ class ToEDSpec extends StageSpec(stageCreatesUnrefAnons = true):
609
609
val rstCfg = RstCfg (RstCfg .Mode .Sync , RstCfg .Active .High )
610
610
val cfg = RTDomainCfg (clkCfg, rstCfg)
611
611
class ID extends RTDesign (cfg):
612
- val x = SInt (16 ) <> IN
613
- val y = SInt (16 ) <> OUT .REG init 0
614
- val r = SInt (16 ) <> VAR .REG init 0
612
+ val x = SInt (16 ) <> IN
613
+ val y = SInt (16 ) <> OUT .REG init 0
614
+ val r = SInt (16 ) <> VAR .REG init 0
615
615
val foo = new RelatedDomain :
616
616
y.din := r
617
617
r.din := 1
@@ -803,8 +803,8 @@ class ToEDSpec extends StageSpec(stageCreatesUnrefAnons = true):
803
803
804
804
test(" RT design with ED domain" ) {
805
805
class Foo extends RTDesign :
806
- val clk = Clk <> VAR
807
- val rst = Rst <> VAR
806
+ val clk = Clk <> VAR
807
+ val rst = Rst <> VAR
808
808
val internal = new EDDomain :
809
809
process(all):
810
810
clk.actual := 0
@@ -878,4 +878,89 @@ class ToEDSpec extends StageSpec(stageCreatesUnrefAnons = true):
878
878
|end Foo""" .stripMargin
879
879
)
880
880
}
881
+
882
+ test(" For loop with a register" ) {
883
+ class Foo (
884
+ val PORT_WIDTH : Int <> CONST = 5
885
+ ) extends RTDesign :
886
+ val r = Bits (PORT_WIDTH ) <> OUT .REG init all(0 )
887
+ for (i <- 0 until PORT_WIDTH )
888
+ r(i).din := 1
889
+ for (i <- 0 until PORT_WIDTH )
890
+ if (r(PORT_WIDTH - 1 - i))
891
+ r(i).din := 0
892
+ end Foo
893
+
894
+ val top = (new Foo ()).toED
895
+ assertCodeString(
896
+ top,
897
+ """ |case class Clk_default() extends Clk
898
+ |case class Rst_default() extends Rst
899
+ |
900
+ |class Foo(val PORT_WIDTH: Int <> CONST = 5) extends EDDesign:
901
+ | val clk = Clk_default <> IN
902
+ | val rst = Rst_default <> IN
903
+ | val r = Bits(PORT_WIDTH) <> OUT
904
+ | process(clk):
905
+ | if (clk.actual.rising)
906
+ | if (rst.actual == 1) r :== b"0".repeat(PORT_WIDTH)
907
+ | else
908
+ | for (i <- 0 until PORT_WIDTH)
909
+ | r(i) :== 1
910
+ | end for
911
+ | for (i <- 0 until PORT_WIDTH)
912
+ | if (r((PORT_WIDTH - 1) - i)) r(i) :== 0
913
+ | end for
914
+ | end if
915
+ | end if
916
+ |end Foo""" .stripMargin
917
+ )
918
+ }
919
+
920
+ test(" For loop with a register and combinational loop" ) {
921
+ class Foo (
922
+ val PORT_WIDTH : Int <> CONST = 5
923
+ ) extends RTDesign :
924
+ val r = Bits (PORT_WIDTH ) <> OUT .REG init all(0 )
925
+ val w = Bits (PORT_WIDTH ) <> OUT
926
+ for (i <- 0 until PORT_WIDTH )
927
+ r(i).din := 1
928
+ for (i <- 0 until PORT_WIDTH )
929
+ if (r(PORT_WIDTH - 1 - i))
930
+ r(i).din := 0
931
+ for (i <- 0 until PORT_WIDTH )
932
+ w(i) := r(i)
933
+ end Foo
934
+
935
+ val top = (new Foo ()).toED
936
+ assertCodeString(
937
+ top,
938
+ """ |case class Clk_default() extends Clk
939
+ |case class Rst_default() extends Rst
940
+ |
941
+ |class Foo(val PORT_WIDTH: Int <> CONST = 5) extends EDDesign:
942
+ | val clk = Clk_default <> IN
943
+ | val rst = Rst_default <> IN
944
+ | val r = Bits(PORT_WIDTH) <> OUT
945
+ | val w = Bits(PORT_WIDTH) <> OUT
946
+ | val r_din = Bits(PORT_WIDTH) <> VAR
947
+ | process(all):
948
+ | r_din := r
949
+ | for (i <- 0 until PORT_WIDTH)
950
+ | r_din(i) := 1
951
+ | end for
952
+ | for (i <- 0 until PORT_WIDTH)
953
+ | if (r((PORT_WIDTH - 1) - i)) r_din(i) := 0
954
+ | end for
955
+ | for (i <- 0 until PORT_WIDTH)
956
+ | w(i) := r(i)
957
+ | end for
958
+ | process(clk):
959
+ | if (clk.actual.rising)
960
+ | if (rst.actual == 1) r :== b"0".repeat(PORT_WIDTH)
961
+ | else r :== r_din
962
+ | end if
963
+ |end Foo""" .stripMargin
964
+ )
965
+ }
881
966
end ToEDSpec
0 commit comments