HDLRuby 2.11.11 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/README.html +3274 -0
  3. data/README.md +608 -99
  4. data/ext/hruby_sim/hruby_rcsim_build.c +27 -0
  5. data/ext/hruby_sim/hruby_sim.h +3 -0
  6. data/ext/hruby_sim/hruby_sim_calc.c +2 -0
  7. data/ext/hruby_sim/hruby_sim_core.c +17 -5
  8. data/ext/hruby_sim/hruby_sim_stack_calc.c +1 -1
  9. data/ext/hruby_sim/hruby_sim_tree_calc.c +8 -1
  10. data/ext/hruby_sim/hruby_sim_vcd.c +24 -7
  11. data/ext/hruby_sim/hruby_sim_vizualize.c +9 -1
  12. data/lib/HDLRuby/backend/hruby_allocator.rb +2 -2
  13. data/lib/HDLRuby/backend/hruby_c_allocator.rb +7 -7
  14. data/lib/HDLRuby/hdr_samples/constant_in_function.rb +3 -1
  15. data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +3 -1
  16. data/lib/HDLRuby/hdr_samples/huge_rom.rb +1 -1
  17. data/lib/HDLRuby/hdr_samples/mei8.rb +11 -11
  18. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +12 -12
  19. data/lib/HDLRuby/hdr_samples/neg_arith_bench.rb +4 -4
  20. data/lib/HDLRuby/hdr_samples/rom_nest.rb +1 -1
  21. data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +4 -4
  22. data/lib/HDLRuby/hdr_samples/struct.rb +44 -10
  23. data/lib/HDLRuby/hdr_samples/with_bram.rb +45 -0
  24. data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +105 -0
  25. data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +69 -0
  26. data/lib/HDLRuby/hdr_samples/with_casts.rb +3 -3
  27. data/lib/HDLRuby/hdr_samples/with_concat.rb +6 -6
  28. data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -2
  29. data/lib/HDLRuby/hdr_samples/with_def.rb +10 -3
  30. data/lib/HDLRuby/hdr_samples/with_define_operator.rb +44 -0
  31. data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +12 -12
  32. data/lib/HDLRuby/hdr_samples/with_init.rb +3 -3
  33. data/lib/HDLRuby/hdr_samples/with_leftright.rb +21 -0
  34. data/lib/HDLRuby/hdr_samples/with_reduce.rb +13 -13
  35. data/lib/HDLRuby/hdr_samples/with_ref_array.rb +6 -6
  36. data/lib/HDLRuby/hdr_samples/with_register_stack.rb +150 -0
  37. data/lib/HDLRuby/hdr_samples/with_sequencer.rb +190 -0
  38. data/lib/HDLRuby/hdr_samples/with_sequencer_deep.rb +91 -0
  39. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +405 -0
  40. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +89 -0
  41. data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +120 -0
  42. data/lib/HDLRuby/hdr_samples/with_subsums.rb +3 -3
  43. data/lib/HDLRuby/hdr_samples/with_terminate.rb +3 -3
  44. data/lib/HDLRuby/hdr_samples/with_to_a.rb +10 -10
  45. data/lib/HDLRuby/hdr_samples/with_values.rb +3 -3
  46. data/lib/HDLRuby/hdrcc.rb +29 -3
  47. data/lib/HDLRuby/hdrlib.rb +1 -1
  48. data/lib/HDLRuby/hruby_bstr.rb +10 -5
  49. data/lib/HDLRuby/hruby_db.rb +2 -2
  50. data/lib/HDLRuby/hruby_high.rb +152 -47
  51. data/lib/HDLRuby/hruby_high_fullname.rb +3 -1
  52. data/lib/HDLRuby/hruby_low.rb +189 -18
  53. data/lib/HDLRuby/hruby_low2c.rb +129 -54
  54. data/lib/HDLRuby/hruby_low2hdr.rb +66 -40
  55. data/lib/HDLRuby/hruby_low2high.rb +86 -44
  56. data/lib/HDLRuby/hruby_low2seq.rb +26 -18
  57. data/lib/HDLRuby/hruby_low2sym.rb +14 -13
  58. data/lib/HDLRuby/hruby_low2vhd.rb +80 -44
  59. data/lib/HDLRuby/hruby_low_bool2select.rb +61 -46
  60. data/lib/HDLRuby/hruby_low_casts_without_expression.rb +56 -44
  61. data/lib/HDLRuby/hruby_low_cleanup.rb +18 -16
  62. data/lib/HDLRuby/hruby_low_fix_types.rb +65 -32
  63. data/lib/HDLRuby/hruby_low_mutable.rb +83 -119
  64. data/lib/HDLRuby/hruby_low_resolve.rb +38 -30
  65. data/lib/HDLRuby/hruby_low_with_bool.rb +33 -16
  66. data/lib/HDLRuby/hruby_low_with_port.rb +3 -3
  67. data/lib/HDLRuby/hruby_low_with_var.rb +23 -9
  68. data/lib/HDLRuby/hruby_low_without_concat.rb +45 -19
  69. data/lib/HDLRuby/hruby_low_without_namespace.rb +47 -32
  70. data/lib/HDLRuby/hruby_low_without_parinseq.rb +32 -16
  71. data/lib/HDLRuby/hruby_low_without_select.rb +37 -24
  72. data/lib/HDLRuby/hruby_low_without_subsignals.rb +280 -0
  73. data/lib/HDLRuby/hruby_rcsim.rb +158 -134
  74. data/lib/HDLRuby/hruby_rsim.rb +194 -20
  75. data/lib/HDLRuby/hruby_rsim_mute.rb +2 -3
  76. data/lib/HDLRuby/hruby_rsim_vcd.rb +125 -50
  77. data/lib/HDLRuby/hruby_values.rb +48 -33
  78. data/lib/HDLRuby/hruby_verilog.rb +90 -48
  79. data/lib/HDLRuby/soft/stacks.rb +219 -0
  80. data/lib/HDLRuby/std/bram.rb +26 -0
  81. data/lib/HDLRuby/std/clocks.rb +1 -1
  82. data/lib/HDLRuby/std/fixpoint.rb +2 -2
  83. data/lib/HDLRuby/std/fsm.rb +48 -11
  84. data/lib/HDLRuby/std/function_generator.rb +2 -2
  85. data/lib/HDLRuby/std/sequencer.rb +1857 -0
  86. data/lib/HDLRuby/std/sequencer_sync.rb +400 -0
  87. data/lib/HDLRuby/std/std.rb +12 -0
  88. data/lib/HDLRuby/version.rb +1 -1
  89. data/tuto/adder_sat_flags_vcd.png +0 -0
  90. data/tuto/addsub_vcd.png +0 -0
  91. data/tuto/alu_vcd.png +0 -0
  92. data/tuto/bit_pong_vcd.png +0 -0
  93. data/tuto/checksum_vcd.png +0 -0
  94. data/tuto/circuit_hdr.odg +0 -0
  95. data/tuto/circuit_hdr.png +0 -0
  96. data/tuto/circuit_hie.odg +0 -0
  97. data/tuto/circuit_hie.png +0 -0
  98. data/tuto/circuit_view.odg +0 -0
  99. data/tuto/circuit_view.png +0 -0
  100. data/tuto/clock_counter_vcd.png +0 -0
  101. data/tuto/counter_ext_vcd.png +0 -0
  102. data/tuto/fact_vcd.png +0 -0
  103. data/tuto/hw_flow.odg +0 -0
  104. data/tuto/hw_flow.png +0 -0
  105. data/tuto/maxxer_vcd.png +0 -0
  106. data/tuto/pingpong0_vcd.png +0 -0
  107. data/tuto/pingpong1_vcd.png +0 -0
  108. data/tuto/pingpong2_vcd.png +0 -0
  109. data/tuto/ram_vcd.png +0 -0
  110. data/tuto/serializer_vcd.png +0 -0
  111. data/tuto/sw_flow.odg +0 -0
  112. data/tuto/sw_flow.png +0 -0
  113. data/tuto/the_counter_vcd.png +0 -0
  114. data/tuto/tutorial_sw.html +2359 -0
  115. data/tuto/tutorial_sw.md +2684 -0
  116. data/tuto/tutorial_sw.pdf +0 -0
  117. data/tuto/tutorial_sw_jp.md +417 -0
  118. metadata +49 -3
  119. data/lib/HDLRuby/hdr_samples/sumprod.rb +0 -29
@@ -4,10 +4,8 @@ require "HDLRuby/hruby_verilog_name.rb"
4
4
  require 'HDLRuby/hruby_low_mutable'
5
5
 
6
6
 
7
- # module HDLRuby::Verilog
8
7
  include HDLRuby::Verilog
9
8
 
10
- #include HDLRuby::Low
11
9
  module HDLRuby::Low
12
10
 
13
11
 
@@ -38,12 +36,16 @@ module HDLRuby::Low
38
36
  $vector_reg = "" # For storing signal type at structure declaration. (temporary)
39
37
  $vector_cnt = 0 # For allocating numbers at structure declaration. (temporary)
40
38
 
39
+
41
40
  class ::Integer
41
+ ## Extends the Integer class with generation of verilog text.
42
+
42
43
  def to_verilog
43
44
  to_s
44
45
  end
45
46
  end
46
47
 
48
+
47
49
  # Class summarizing "hash" used for "par" or "seq" conversion.
48
50
  class Fm
49
51
  attr_reader :fm_seq, :fm_par, :rep, :rep_sharp
@@ -115,8 +117,9 @@ module HDLRuby::Low
115
117
  TruncersI = Truncers.new
116
118
 
117
119
 
118
- # A class that translates the left-hand side, operator, and right-hand side into form of expression.
119
120
  class Binary
121
+ ## Enhances Binary with verilog generation.
122
+
120
123
  # Converts the system to Verilog code.
121
124
  def to_verilog
122
125
  return "(#{self.left.to_verilog} #{self.operator} #{self.right.to_verilog})"
@@ -158,9 +161,10 @@ module HDLRuby::Low
158
161
  end
159
162
  end
160
163
 
161
- # class of Represent blocking substitution or nonblocking assignment.
162
- # Enhance Transmit with generation of verilog code.
164
+
163
165
  class Transmit
166
+ ## Enhances Transmit with generation of verilog code.
167
+
164
168
  # Converts the system to Verilog code.
165
169
  def to_verilog(spc = 3)
166
170
  # Determine blocking assignment or nonblocking substitution from mode and return it.
@@ -169,8 +173,10 @@ module HDLRuby::Low
169
173
  end
170
174
  end
171
175
 
172
- # Enhance Print with generation of verilog code.
176
+
173
177
  class Print
178
+ ## Enhances Print with generation of verilog code.
179
+
174
180
  # Converts the print to Verilog code.
175
181
  def to_verilog(spc = 3)
176
182
  code = "#{" " * spc}$write(#{self.each_arg.map do |arg|
@@ -180,17 +186,20 @@ module HDLRuby::Low
180
186
  end
181
187
  end
182
188
 
183
- # Enhance TimeTerminate with generation of verilog code.
189
+
184
190
  class TimeTerminate
191
+ ## Enhances TimeTerminate with generation of verilog code.
192
+
185
193
  # Converts the terminate to Verilog code.
186
194
  def to_verilog(spc = 3)
187
195
  return "#{" " * spc}$finish;"
188
196
  end
189
197
  end
190
198
 
191
- # To scheduling to the Block.
192
- # Enhance Block with generation of verilog code.
199
+
193
200
  class Block
201
+ ## Enhances Block with generation of verilog code.
202
+ # To scheduling to the Block.
194
203
 
195
204
  # Converts the system to Verilog code adding 'spc' spaces at the begining
196
205
  # of each line.
@@ -1439,9 +1448,10 @@ module HDLRuby::Low
1439
1448
  end
1440
1449
  end
1441
1450
 
1442
- # Used to display variable names.
1443
- # Enhance RefName with generation of verilog code.
1451
+
1444
1452
  class RefName
1453
+ ## Enhances RefName with generation of verilog code.
1454
+
1445
1455
  # Converts the system to Verilog code using +renamer+ for producing Verilog-compatible names.
1446
1456
  def to_verilog
1447
1457
  vname = name_to_verilog(self.name)
@@ -1463,9 +1473,10 @@ module HDLRuby::Low
1463
1473
  end
1464
1474
  end
1465
1475
 
1466
- # Used to convert an array.
1467
- # Enhance RefIndex with generation of verilog code.
1476
+
1468
1477
  class RefIndex
1478
+ ## Enhances RefIndex with generation of verilog code.
1479
+
1469
1480
  # Converts the system to Verilog code.
1470
1481
  def to_verilog
1471
1482
  return "#{self.ref.to_verilog}[#{self.index.to_verilog}]"
@@ -1473,9 +1484,9 @@ module HDLRuby::Low
1473
1484
  end
1474
1485
 
1475
1486
 
1476
- # Used to indicate the number of bits.
1477
- # Enhance TypeVector with generation of verilog code.
1478
1487
  class TypeVector
1488
+ ## Enhances TypeVector with generation of verilog code.
1489
+
1479
1490
  # Converts the system to Verilog code.
1480
1491
  def to_verilog
1481
1492
  # if self.base.name.to_s != "bit"
@@ -1486,16 +1497,22 @@ module HDLRuby::Low
1486
1497
  end
1487
1498
  end
1488
1499
 
1489
- # Necessary for displaying bit width (eg, specify and assign).
1500
+
1490
1501
  class RefRange
1502
+ ## Enhances RefRange with generation of verilog code.
1503
+
1504
+ # Necessary for displaying bit width (eg, specify and assign).
1505
+
1491
1506
  # Converts the system to Verilog code.
1492
1507
  def to_verilog(unknown = false)
1493
1508
  return "#{self.ref.to_verilog}[#{self.range.first.to_getrange}:#{self.range.last.to_getrange}]"
1494
1509
  end
1495
1510
  end
1496
1511
 
1497
- # Use it when collecting references.
1512
+
1498
1513
  class RefConcat
1514
+ ## Enhances RefConcat with generation of verilog code.
1515
+
1499
1516
  def to_verilog
1500
1517
  ref = self.each_ref.to_a
1501
1518
 
@@ -1509,18 +1526,20 @@ module HDLRuby::Low
1509
1526
  end
1510
1527
  end
1511
1528
 
1512
- # Used to output bitstring.
1513
- # Enhance HDLRuby with generation of verilog code.
1529
+
1514
1530
  class HDLRuby::BitString
1531
+ ## Enhances BitString with generation of verilog code.
1532
+
1515
1533
  # Converts the system to Verilog code.
1516
1534
  def to_verilog
1517
1535
  return "#{self.to_s}"
1518
1536
  end
1519
1537
  end
1520
1538
 
1521
- # Used for connection using choice.
1522
- # Enhance Select with generation of verilog code.
1539
+
1523
1540
  class Select
1541
+ ## Enhances Select with generation of verilog code.
1542
+
1524
1543
  # Converts the system to Verilog code.
1525
1544
  def to_verilog
1526
1545
  # Outputs the first and second choices (choice (0) and choice (1)).
@@ -1535,9 +1554,10 @@ module HDLRuby::Low
1535
1554
  end
1536
1555
  end
1537
1556
 
1538
- # Used to output numbers.
1539
- # Enhance Value with generation of verilog code.
1557
+
1540
1558
  class Value
1559
+ ## Enhances Value with generation of verilog code.
1560
+
1541
1561
  # Converts the system to Verilog code.
1542
1562
  # If it is bit, it is b, and if it is int, it is represented by d. (Example: 4'b0000, 32'd1)
1543
1563
  def to_verilog(unknown = nil)
@@ -1579,9 +1599,9 @@ module HDLRuby::Low
1579
1599
  end
1580
1600
 
1581
1601
 
1582
- # Used to transrate if.
1583
- # Enhance If with generation of verilog code.
1584
1602
  class If
1603
+ ## Enhances If with generation of verilog code.
1604
+
1585
1605
  # # Converts the system to Verilog code.
1586
1606
  # def to_verilog(mode = nil)
1587
1607
  # Converts to Verilog code, checking adding 'spc' spaces at the begining
@@ -1617,10 +1637,10 @@ module HDLRuby::Low
1617
1637
  end
1618
1638
  end
1619
1639
 
1620
- # Used to translate case
1640
+
1621
1641
  class Case
1622
- # def to_verilog(mode = nil)
1623
- #
1642
+ ## Enhances Case with generation of verilog code.
1643
+
1624
1644
  # Converts to Verilog code, checking if variables are register
1625
1645
  # or wire adding 'spc' spaces at the begining of each line.
1626
1646
  def to_verilog(spc = 3)
@@ -1656,9 +1676,10 @@ module HDLRuby::Low
1656
1676
  end
1657
1677
  end
1658
1678
 
1659
- # Translate expression of combination circuit.
1660
- # Enhance Connection with generation of verilog code.
1679
+
1661
1680
  class Connection
1681
+ ## Enhances Connection with generation of verilog code.
1682
+
1662
1683
  # Converts the system to Verilog code.
1663
1684
 
1664
1685
  # Method used for array.
@@ -1715,23 +1736,29 @@ module HDLRuby::Low
1715
1736
  end
1716
1737
  end
1717
1738
 
1718
- # It could be used for instantiation.
1739
+
1719
1740
  class RefThis
1741
+ ## Enhances RefThis with generation of verilog code.
1742
+
1720
1743
  def to_another_verilog
1721
1744
  return ""
1722
1745
  end
1723
1746
  end
1724
1747
 
1725
- # Used when using "~" for expressions.
1748
+
1726
1749
  class Unary
1750
+ ## Enhances Unary with generation of verilog code.
1751
+
1727
1752
  # Converts the system to Verilog code.
1728
1753
  def to_verilog
1729
1754
  return "#{self.operator[0]}#{self.child.to_verilog}"
1730
1755
  end
1731
1756
  end
1732
1757
 
1733
- # Used when casting expressions.
1758
+
1734
1759
  class Cast
1760
+ ## Enhances Cast with generation of verilog code.
1761
+
1735
1762
  # Converts the system to Verilog code.
1736
1763
  # NOTE: the cast is rounded up size bit-width cast is not supported
1737
1764
  # by traditional verilog.
@@ -1773,9 +1800,10 @@ module HDLRuby::Low
1773
1800
  end
1774
1801
  end
1775
1802
 
1776
- # For declaring variables.
1777
- # Enhance SignalI with generation of verilog code.
1803
+
1778
1804
  class SignalI
1805
+ ## Enhances SignalI with generation of verilog code.
1806
+
1779
1807
  # Converts the system to Verilog code.
1780
1808
  def to_verilog
1781
1809
  # Convert unusable characters and return them.
@@ -1785,25 +1813,30 @@ module HDLRuby::Low
1785
1813
  end
1786
1814
  end
1787
1815
 
1788
- # If it is signed, it outputs signed.
1789
- # Enhance Type with generation of verilog code.
1816
+
1790
1817
  class Type
1818
+ ## Enhances Type with generation of verilog code.
1819
+
1791
1820
  # Converts the type to Verilog code.
1792
1821
  def to_verilog
1793
1822
  return self.name == :signed ? "#{self.name.to_s} " : ""
1794
1823
  end
1795
1824
  end
1796
1825
 
1797
- # Replace type by refered type.
1826
+
1798
1827
  class TypeDef
1828
+ ## Enhances TypeDef with generation of verilog code.
1829
+
1799
1830
  # Converts the type to verilog code.
1800
1831
  def to_verilog
1801
1832
  return self.def.to_verilog
1802
1833
  end
1803
1834
  end
1804
1835
 
1805
- # Use it when collecting.
1836
+
1806
1837
  class Concat
1838
+ ## Enhances Concat with generation of verilog code.
1839
+
1807
1840
  def to_verilog
1808
1841
  expression = self.each_expression.to_a
1809
1842
 
@@ -1817,14 +1850,19 @@ module HDLRuby::Low
1817
1850
  end
1818
1851
  end
1819
1852
 
1820
- # Look at the unit of time, convert the time to ps and output it.
1821
- # One of two people, TimeWait and Delay.
1853
+
1822
1854
  class TimeWait
1855
+ ## Enhances TimeWait with generation of verilog code.
1856
+
1823
1857
  def to_verilog(spc = 3)
1824
1858
  return (" " * spc) + self.delay.to_verilog + "\n"
1825
1859
  end
1826
1860
  end
1861
+
1862
+
1827
1863
  class Delay
1864
+ ## Enhances Delay with generation of verilog code.
1865
+
1828
1866
  def to_verilog
1829
1867
  time = self.value.to_s
1830
1868
  if(self.unit.to_s == "ps") then
@@ -1842,8 +1880,9 @@ module HDLRuby::Low
1842
1880
  end
1843
1881
 
1844
1882
 
1845
- # Generate verilog code for the TimeRepeat.
1846
1883
  class TimeRepeat
1884
+ ## Enhances TimeRepeat with generation of verilog code.
1885
+
1847
1886
  def to_verilog(spc = 3)
1848
1887
  result = (" " * spc) + "repeat(#{self.number})" + "\n"
1849
1888
  result << self.statement.to_verilog(spc+3)
@@ -1855,8 +1894,9 @@ module HDLRuby::Low
1855
1894
  #class TypeTuple
1856
1895
  #class Event
1857
1896
 
1858
- # Enhance SystemT with generation of verilog code.
1897
+
1859
1898
  class SystemT
1899
+ ## Enhances SystemT with generation of verilog code.
1860
1900
 
1861
1901
  ## Tells if a connection is actually a port connection.
1862
1902
  def port_output_connection?(connection)
@@ -2163,9 +2203,10 @@ module HDLRuby::Low
2163
2203
  codeC << "),"
2164
2204
  end
2165
2205
  end
2166
- # Remove the last "," for conforming with Verilog syntax.
2167
- # and close the port connection.
2168
- codeC[-1] = ");\n"
2206
+ # Remove the last "," if any for conforming with Verilog syntax.
2207
+ codeC.chop! if codeC[-1] == ","
2208
+ # And close the port connection.
2209
+ codeC << ");\n"
2169
2210
  end
2170
2211
 
2171
2212
 
@@ -2254,8 +2295,9 @@ module HDLRuby::Low
2254
2295
  end
2255
2296
 
2256
2297
 
2257
- # Enhance StringE with generation of verilog code.
2258
2298
  class StringE
2299
+ ## Enhances stringE with generation of verilog code.
2300
+
2259
2301
  # Converts the system to Verilog code.
2260
2302
  def to_verilog(spc = 3)
2261
2303
  code = "\"#{Low.v_string(self.content)}" +
@@ -2270,8 +2312,8 @@ end
2270
2312
 
2271
2313
 
2272
2314
 
2273
- ## Extends the Numeric class with generation of verilog text.
2274
2315
  class ::Numeric
2316
+ ## Extends the Numeric class with generation of verilog text.
2275
2317
 
2276
2318
  # Generates the text of the equivalent verilog code.
2277
2319
  # +level+ is the hierachical level of the object.
@@ -0,0 +1,219 @@
1
+ require 'std/bram'
2
+
3
+ module HDLRuby::High::Soft
4
+
5
+
6
+ # Declare the possible commands for the stack.
7
+ PUSH = 0 # Pushes the value of input din into the stack.
8
+ POP = 1 # Pops din values for the stack. If din is negative, allocates din elements on the stack.
9
+ READ = 2 # Read the value address din and output it on dout.
10
+ WRITE = 3 # Write the value at the top of the stack at address din.
11
+
12
+
13
+
14
+
15
+
16
+ # Describe a stack based on a BRAM (compatible with FPGA's)
17
+ # - 'widthD': data bit width
18
+ # - 'size' : the size of the stack
19
+ system :bram_stack do |widthD, size|
20
+ # Compute the address width.
21
+ widthA = (size-1).width
22
+
23
+ # Compute the bit width of the stack pointer register.
24
+ widthS = (size+1).width
25
+
26
+ # Declare the inputs and outputs.
27
+ input :clk, :rst, :ce
28
+ input :cmd
29
+ [widthD].input :din
30
+ [widthD].output :dout
31
+ output :empty, :full
32
+
33
+ # Declare the BRAM containing the stack data.
34
+ inner rwb: 1
35
+ [widthA].inner :addr
36
+ [widthD].inner :brin, :brout
37
+ bram(widthA,widthD).(:bramI).(clk,rwb,addr,brin,brout)
38
+
39
+ # Declare the stack pointer register and the top of stack value.
40
+ [widthS].inner sp: size
41
+ [widthD].inner :top
42
+
43
+ # Tells if the stack is empty or full.
44
+ empty <= (sp == size)
45
+ full <= (sp == 0)
46
+
47
+ # The output bus is the top of the stack.
48
+ dout <= top
49
+
50
+ # The clock process handling the access.
51
+ seq(clk.posedge) do
52
+ # By default, read before the top of the memory.
53
+ rwb <= 1
54
+ hif(rst) do
55
+ # sp is set to size (stack empty).
56
+ sp <= size
57
+ top <= 0
58
+ end
59
+ helsif(ce) do
60
+ # Now depending on the command.
61
+ hcase(cmd)
62
+ hwhen(PUSH) do
63
+ # Is the stack full?
64
+ hif(~full) do
65
+ # No, can push onto the stack.
66
+ # Update the top register.
67
+ top <= din
68
+ # Update the bram.
69
+ brin <= din
70
+ rwb <= 0
71
+ # Finally, decrease sp.
72
+ sp <= sp - 1
73
+ # The address is the top of the stack
74
+ addr <= sp
75
+ end
76
+ end
77
+ hwhen(POP) do
78
+ # Is the stack empty?
79
+ hif(~empty) do
80
+ # No, can pop from the stack.
81
+ # Update the top register.
82
+ top <= brout
83
+ # Finally, increase sp.
84
+ sp <= sp + 1
85
+ end
86
+ end
87
+ end
88
+ hif(~ce | cmd != PUSH) do
89
+ # By default the address is the top of the stack + 1
90
+ addr <= sp + 1
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+
97
+ # Describe a frame stack based on a BRAM (compatible with FPGA's)
98
+ # - 'widthD': data bit width
99
+ # - 'size' : the size of the stack
100
+ # - 'depth' : the maximum number of frames.
101
+ system :bram_frame_stack do |widthD, size, depth|
102
+ # Compute the address width.
103
+ widthA = (size-1).width
104
+
105
+ # Compute the bit width of the frame pointers.
106
+ widthF = (size+1).width
107
+
108
+ # compute the bit width of the frame stack pointer.
109
+ widthS = (depth+1).width
110
+
111
+ # Create the type used for accessing the frame stack.
112
+ typedef(:locT) { { frame: bit[widthS], offset: bit[widthF] } }
113
+
114
+ # Declare the inputs and outputs.
115
+ input :clk, :rst, :ce
116
+ [2].input :cmd
117
+ locT.input :loc
118
+ [widthD].input :din
119
+ [widthD].output :dout
120
+ output :empty, :full
121
+
122
+ # Declare the frame index stac pointer.
123
+ [widthS].inner :sp
124
+
125
+ # Declare the frame index table.
126
+ bit[widthF][-depth].inner :indexes
127
+
128
+ # Declare the BRAM containing the frames data.
129
+ inner rwb: 1
130
+ [widthA].inner :addr
131
+ [widthD].inner :brin, :brout
132
+ bram(widthA,widthD).(:bramI).(clk,rwb,addr,brin,brout)
133
+
134
+ # Tells if the stack is empty or full.
135
+ empty <= (sp == depth)
136
+ full <= (sp == 0)
137
+
138
+ # The input data is always the input of the bram.
139
+ brin <= din
140
+
141
+ # The output is always the output of the bram.
142
+ dout <= brout
143
+
144
+ # The clock process handling the access.
145
+ seq(clk.posedge) do
146
+ # By default, read before the top of the memory.
147
+ rwb <= 1
148
+ hif(rst) do
149
+ # sp is set to depth (stack empty).
150
+ sp <= depth
151
+ end
152
+ helsif(ce) do
153
+ # Now depending on the command.
154
+ hcase(cmd)
155
+ hwhen(PUSH) do
156
+ # Is the stack full or is the frame to push empty?
157
+ hif(~(full | loc.offset == 0)) do
158
+ # No, we can proceed.
159
+ # Decrease sp.
160
+ sp <= sp - 1
161
+ # Adds the frame.
162
+ hif(~empty) do
163
+ indexes[sp] <= loc.offset + indexes[sp+1]
164
+ end
165
+ helse do
166
+ indexes[sp] <= loc.offset
167
+ end
168
+ end
169
+ end
170
+ hwhen(POP) do
171
+ # Is the stack empty?
172
+ hif(~empty) do
173
+ # No, can pop a frame from the stack.
174
+ # Increase sp.
175
+ sp <= sp + 1
176
+ end
177
+ end
178
+ hwhen(READ) do
179
+ # Read access, is the frame valid?
180
+ cur_frame = sp+loc.frame
181
+ hif (~(empty | cur_frame >= depth)) do
182
+ # The frame is valid. Is the offset valid?
183
+ addr_calc = indexes[cur_frame] - loc.offset - 1
184
+ hif ((cur_frame < depth-1) &
185
+ (addr_calc > indexes[cur_frame+1])) do
186
+ # Not the first frame and the address is valid.
187
+ addr <= addr_calc
188
+ end
189
+ helsif ((cur_frame == depth-1) &
190
+ (addr_calc + 1 > 0)) do
191
+ # The first frame and the address is valid.
192
+ addr <= addr_calc
193
+ end
194
+ end
195
+ end
196
+ hwhen(WRITE) do
197
+ # Write access, is the frame valid?
198
+ cur_frame = sp+loc.frame
199
+ hif (~(empty | cur_frame >= depth)) do
200
+ # The frame is valid. Is the offset valid?
201
+ addr_calc = indexes[cur_frame] - loc.offset - 1
202
+ hif ((cur_frame < depth-1) &
203
+ (addr_calc > indexes[cur_frame+1])) do
204
+ # Not the first frame and the address is valid.
205
+ addr <= addr_calc
206
+ rwb <= 0
207
+ end
208
+ helsif ((cur_frame == depth-1) &
209
+ (addr_calc + 1 > 0)) do
210
+ # The first frame and the address is valid.
211
+ addr <= addr_calc
212
+ rwb <= 0
213
+ end
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end
@@ -0,0 +1,26 @@
1
+ module HDLRuby::High::Std
2
+
3
+ # Describe a RAM compatibile with BRAM of FPGAs.
4
+ # - 'widthA': address bit width
5
+ # - 'widthD': data bit width
6
+ # - 'size': the size of the memory.
7
+ system :bram do |widthA, widthD, size = nil|
8
+ # Process size if required.
9
+ size = 2**widthA unless size
10
+ # puts "widthA=#{widthA} widthD=#{widthD} size=#{size}"
11
+
12
+ # Declares the io of the ram.
13
+ input :clk, :rwb
14
+ [widthA].input :addr
15
+ [widthD].input :din
16
+ [widthD].output :dout
17
+
18
+ bit[widthD][-size].inner mem: [ :"_b#{"0"*widthD}".to_value ] * size
19
+
20
+ par(clk.negedge) do
21
+ hif(rwb == 0) { mem[addr] <= din }
22
+ dout <= mem[addr]
23
+ end
24
+ end
25
+
26
+ end
@@ -135,8 +135,8 @@ module HDLRuby::High::Std
135
135
  end
136
136
 
137
137
 
138
- # Enhnace the events with multiply operator.
139
138
  class HDLRuby::High::Event
139
+ # Enhance the events with multiply operator.
140
140
 
141
141
  # Creates a new event activated every +times+ occurences of the
142
142
  # current event.
@@ -55,14 +55,14 @@ module HDLRuby::High::Std
55
55
  if (typ.signed?) then
56
56
  (left.as(signed[isize+fsize*2])*right) >> fsize
57
57
  else
58
- (left.as([isize+fsize*2])*right) >> fsize
58
+ (left.as(bit[isize+fsize*2])*right) >> fsize
59
59
  end
60
60
  end
61
61
  typ.define_operator(:/) do |left,right|
62
62
  if (typ.signed?) then
63
63
  (left.as(signed[isize+fsize*2]) << fsize) / right
64
64
  else
65
- (left.as([isize+fsize*2]) << fsize) / right
65
+ (left.as(bit[isize+fsize*2]) << fsize) / right
66
66
  end
67
67
  end
68
68
  # Define the removal of the point.