HDLRuby 2.10.5 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/HDLRuby.gemspec +1 -0
- data/README.md +8 -4
- data/Rakefile +8 -0
- data/{lib/HDLRuby/sim/Makefile → ext/hruby_sim/Makefile_csim} +0 -0
- data/ext/hruby_sim/extconf.rb +13 -0
- data/ext/hruby_sim/hruby_rcsim_build.c +1188 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim.h +255 -16
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_calc.c +310 -181
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_core.c +34 -17
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_list.c +0 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c +4 -1
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c.sav +0 -0
- data/ext/hruby_sim/hruby_sim_tree_calc.c +375 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vcd.c +5 -5
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vizualize.c +2 -2
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_value_pool.c +4 -1
- data/lib/HDLRuby/hdr_samples/bstr_bench.rb +2 -0
- data/lib/HDLRuby/hdr_samples/case_bench.rb +2 -2
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +0 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +46 -0
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/print_bench.rb +62 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +5 -3
- data/lib/HDLRuby/hdr_samples/simple_counter_bench.rb +43 -0
- data/lib/HDLRuby/hdrcc.rb +54 -8
- data/lib/HDLRuby/hruby_bstr.rb +1175 -917
- data/lib/HDLRuby/hruby_high.rb +200 -90
- data/lib/HDLRuby/hruby_high_fullname.rb +82 -0
- data/lib/HDLRuby/hruby_low.rb +41 -23
- data/lib/HDLRuby/hruby_low2c.rb +7 -0
- data/lib/HDLRuby/hruby_rcsim.rb +978 -0
- data/lib/HDLRuby/hruby_rsim.rb +1134 -0
- data/lib/HDLRuby/hruby_rsim_vcd.rb +322 -0
- data/lib/HDLRuby/hruby_values.rb +362 -18
- data/lib/HDLRuby/hruby_verilog.rb +21 -3
- data/lib/HDLRuby/version.rb +1 -1
- metadata +24 -13
@@ -44,7 +44,9 @@ Value get_value() {
|
|
44
44
|
}
|
45
45
|
}
|
46
46
|
/* Readjust the position in the pool and return the value. */
|
47
|
-
return pool_values[pool_pos++];
|
47
|
+
// return pool_values[pool_pos++];
|
48
|
+
Value res = pool_values[pool_pos++];
|
49
|
+
return res;
|
48
50
|
}
|
49
51
|
|
50
52
|
/** Get the current top value. */
|
@@ -59,6 +61,7 @@ Value get_top_value() {
|
|
59
61
|
|
60
62
|
/** Frees the last value of the pool. */
|
61
63
|
void free_value() {
|
64
|
+
if (pool_pos <= 0) { printf("Pool error!\n");exit(1);}
|
62
65
|
if (pool_pos > 0) pool_pos--;
|
63
66
|
}
|
64
67
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# A simple D-FF
|
2
|
+
system :dff do
|
3
|
+
input :clk, :d
|
4
|
+
output q: 0
|
5
|
+
|
6
|
+
(q <= d).at(clk.posedge)
|
7
|
+
end
|
8
|
+
|
9
|
+
# A benchmark for the dff.
|
10
|
+
system :dff_bench do
|
11
|
+
inner :clk
|
12
|
+
inner :d0, :q0, :d1, :q1
|
13
|
+
|
14
|
+
dff(:my_dff0).(clk,d0,q0)
|
15
|
+
dff(:my_dff1).(d0,d1,q1)
|
16
|
+
|
17
|
+
d0 <= ~q0
|
18
|
+
d1 <= ~q1
|
19
|
+
|
20
|
+
timed do
|
21
|
+
clk <= 0
|
22
|
+
!10.ns
|
23
|
+
clk <= 1
|
24
|
+
!10.ns
|
25
|
+
clk <= 0
|
26
|
+
!10.ns
|
27
|
+
clk <= 1
|
28
|
+
!10.ns
|
29
|
+
clk <= 0
|
30
|
+
!10.ns
|
31
|
+
clk <= 1
|
32
|
+
!10.ns
|
33
|
+
clk <= 0
|
34
|
+
!10.ns
|
35
|
+
clk <= 1
|
36
|
+
!10.ns
|
37
|
+
clk <= 0
|
38
|
+
!10.ns
|
39
|
+
clk <= 1
|
40
|
+
!10.ns
|
41
|
+
clk <= 0
|
42
|
+
!10.ns
|
43
|
+
clk <= 1
|
44
|
+
!10.ns
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
##
|
2
|
+
# A simple system for testing hw print and strings.
|
3
|
+
######################################################
|
4
|
+
|
5
|
+
system :with_print do
|
6
|
+
input :clk, :rst
|
7
|
+
[4].output :counter
|
8
|
+
|
9
|
+
seq(clk.posedge) do
|
10
|
+
hif(rst) do
|
11
|
+
counter <= 0
|
12
|
+
end
|
13
|
+
helse do
|
14
|
+
counter <= counter + 1
|
15
|
+
hprint("In '#{__FILE__}' line #{__LINE__}: ")
|
16
|
+
hprint("Counter=", counter, "\n")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# A benchmark for the dff.
|
22
|
+
system :with_print_bench do
|
23
|
+
inner :clk, :rst
|
24
|
+
[4].inner :counter
|
25
|
+
|
26
|
+
with_print(:my_print).(clk,rst,counter)
|
27
|
+
|
28
|
+
timed do
|
29
|
+
clk <= 0
|
30
|
+
rst <= 0
|
31
|
+
!10.ns
|
32
|
+
clk <= 1
|
33
|
+
rst <= 0
|
34
|
+
!10.ns
|
35
|
+
clk <= 0
|
36
|
+
rst <= 1
|
37
|
+
!10.ns
|
38
|
+
clk <= 1
|
39
|
+
rst <= 1
|
40
|
+
!10.ns
|
41
|
+
clk <= 0
|
42
|
+
rst <= 0
|
43
|
+
!10.ns
|
44
|
+
clk <= 1
|
45
|
+
!10.ns
|
46
|
+
clk <= 0
|
47
|
+
!10.ns
|
48
|
+
clk <= 1
|
49
|
+
!10.ns
|
50
|
+
clk <= 0
|
51
|
+
!10.ns
|
52
|
+
clk <= 1
|
53
|
+
!10.ns
|
54
|
+
clk <= 0
|
55
|
+
!10.ns
|
56
|
+
clk <= 1
|
57
|
+
!10.ns
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
# cur_system.properties[:pre_driver] = "drivers/hw_print.rb", :hw_print_generator
|
62
|
+
end
|
@@ -6,9 +6,11 @@ system :rom4_8 do
|
|
6
6
|
[2..0].input :addr
|
7
7
|
[7..0].output :data0,:data1,:data2
|
8
8
|
|
9
|
-
bit[7..0][0..7].constant content0: [
|
10
|
-
|
11
|
-
|
9
|
+
bit[7..0][0..7].constant content0: [_00000000,_00000001,_00000010,_00000011,
|
10
|
+
_00000100,_00000101,_00000110,_00000111]
|
11
|
+
signed[7..0][-8].constant content1: [_sh00,_sh01,_sh02,_sh03,
|
12
|
+
_sh04,_sh05,_sh06,_sh07]
|
13
|
+
typ[-8].constant content2: (8).times.map {|i| i.to_expr.as(typ) }.reverse
|
12
14
|
|
13
15
|
data0 <= content0[addr]
|
14
16
|
data1 <= content1[addr]
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# A benchmark for very simple counters.
|
2
|
+
# Also test the use of ~ on the clock.
|
3
|
+
system :counter_bench do
|
4
|
+
inner :clk, :rst
|
5
|
+
[3].inner :counter
|
6
|
+
[4].inner :counter2
|
7
|
+
|
8
|
+
par(clk.posedge) do
|
9
|
+
hif(rst) { counter <= 0 }
|
10
|
+
helse { counter <= counter + 1 }
|
11
|
+
end
|
12
|
+
|
13
|
+
par(clk.posedge) do
|
14
|
+
hif(rst) { counter2 <= 0 }
|
15
|
+
helse { counter2 <= counter2 + 1 }
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
timed do
|
20
|
+
clk <= 0
|
21
|
+
rst <= 0
|
22
|
+
!10.ns
|
23
|
+
clk <= 1
|
24
|
+
rst <= 0
|
25
|
+
!10.ns
|
26
|
+
clk <= ~clk
|
27
|
+
rst <= 1
|
28
|
+
!10.ns
|
29
|
+
clk <= ~clk
|
30
|
+
!10.ns
|
31
|
+
clk <= ~clk
|
32
|
+
rst <= 0
|
33
|
+
!10.ns
|
34
|
+
clk <= ~clk
|
35
|
+
!10.ns
|
36
|
+
10.times do
|
37
|
+
clk <= ~clk
|
38
|
+
!10.ns
|
39
|
+
clk <= ~clk
|
40
|
+
!10.ns
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/HDLRuby/hdrcc.rb
CHANGED
@@ -363,10 +363,22 @@ $optparse = OptionParser.new do |opts|
|
|
363
363
|
opts.on("--allocate=LOW,HIGH,WORD","Allocate signals to addresses") do |v|
|
364
364
|
$options[:allocate] = v
|
365
365
|
end
|
366
|
-
opts.on("-S",
|
366
|
+
opts.on("-S","--sim","Default simulator (hybrid C-Ruby)") do |v|
|
367
|
+
$options[:rcsim] = v
|
368
|
+
$options[:multiple] = v
|
369
|
+
end
|
370
|
+
opts.on("--csim","Standalone C-based simulator") do |v|
|
367
371
|
$options[:clang] = v
|
368
372
|
$options[:multiple] = v
|
369
|
-
$options[:
|
373
|
+
$options[:csim] = v
|
374
|
+
end
|
375
|
+
opts.on("--rsim","Ruby-based simulator") do |v|
|
376
|
+
$options[:rsim] = v
|
377
|
+
$options[:multiple] = v
|
378
|
+
end
|
379
|
+
opts.on("--rcsim","Hybrid C-Ruby-based simulator") do |v|
|
380
|
+
$options[:rcsim] = v
|
381
|
+
$options[:multiple] = v
|
370
382
|
end
|
371
383
|
opts.on("--vcd", "The simulator will generate a vcd file") do |v|
|
372
384
|
$options[:vcd] = v
|
@@ -556,12 +568,12 @@ end
|
|
556
568
|
# Generate the result.
|
557
569
|
# Get the top systemT.
|
558
570
|
HDLRuby.show "#{Time.now}#{show_mem}"
|
559
|
-
|
571
|
+
# Ruby simulation uses the HDLRuby::High tree, other the HDLRuby::Lowais used
|
572
|
+
$top_system = ($options[:rsim] || $options[:rcsim]) ? $top_instance.systemT : $top_instance.to_low.systemT
|
560
573
|
$top_intance = nil # Free as much memory as possible.
|
561
574
|
HDLRuby.show "##### Top system built #####"
|
562
575
|
HDLRuby.show "#{Time.now}#{show_mem}"
|
563
576
|
|
564
|
-
|
565
577
|
# # Apply the pre drivers if any.
|
566
578
|
# Hdecorator.each_with_property(:pre_driver) do |obj, value|
|
567
579
|
# unless value.is_a?(Array) && value.size == 2 then
|
@@ -746,11 +758,12 @@ elsif $options[:clang] then
|
|
746
758
|
$output << HDLRuby::Low::Low2C.main(top_system,
|
747
759
|
*top_system.each_systemT_deep.to_a)
|
748
760
|
end
|
749
|
-
if $options[:
|
761
|
+
if $options[:csim] then
|
750
762
|
# Simulation mode, compile and exectute.
|
751
763
|
# Path of the simulator core files.
|
752
|
-
# simdir =
|
753
|
-
|
764
|
+
# $simdir = $hdr_dir + "sim/"
|
765
|
+
# puts "$hdr_dir=#{$hdr_dir}"
|
766
|
+
$simdir = $hdr_dir + "/../../ext/hruby_sim/"
|
754
767
|
# Generate and execute the simulation commands.
|
755
768
|
# Kernel.system("cp -n #{simdir}* #{$output}/; cd #{$output}/ ; make -s ; ./hruby_simulator")
|
756
769
|
Dir.entries($simdir).each do |filename|
|
@@ -826,7 +839,8 @@ elsif $options[:verilog] then
|
|
826
839
|
# Open the file for current systemT
|
827
840
|
outfile = File.open($name,"w")
|
828
841
|
# Generate the Verilog code in to.
|
829
|
-
outfile << systemT.to_verilog
|
842
|
+
# outfile << systemT.to_verilog
|
843
|
+
outfile << systemT.to_verilog($options[:vcd])
|
830
844
|
# Close the file.
|
831
845
|
outfile.close
|
832
846
|
# Clears the name.
|
@@ -838,6 +852,38 @@ elsif $options[:verilog] then
|
|
838
852
|
$output << systemT.to_verilog
|
839
853
|
end
|
840
854
|
end
|
855
|
+
elsif $options[:rsim] then
|
856
|
+
HDLRuby.show "Loading Ruby-level simulator..."
|
857
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
858
|
+
# Ruby-level simulation.
|
859
|
+
require 'HDLRuby/hruby_rsim.rb'
|
860
|
+
# Is VCD output is required.
|
861
|
+
if $options[:vcd] then
|
862
|
+
# Yes
|
863
|
+
require "HDLRuby/hruby_rsim_vcd.rb"
|
864
|
+
vcdout = File.open($output+"/hruby_simulator.vcd","w")
|
865
|
+
$top_system.sim(vcdout)
|
866
|
+
vcdout.close
|
867
|
+
else
|
868
|
+
# No
|
869
|
+
$top_system.sim($stdout)
|
870
|
+
end
|
871
|
+
HDLRuby.show "End of Ruby-level simulation..."
|
872
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
873
|
+
elsif $options[:rcsim] then
|
874
|
+
HDLRuby.show "Building the hybrid C-Ruby-level simulator..."
|
875
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
876
|
+
# C-Ruby-level simulation.
|
877
|
+
require 'HDLRuby/hruby_rcsim.rb'
|
878
|
+
# Merge the included from the top system.
|
879
|
+
$top_system.merge_included!
|
880
|
+
# Generate the C data structures.
|
881
|
+
$top_system.to_rcsim
|
882
|
+
HDLRuby.show "Executing the hybrid C-Ruby-level simulator..."
|
883
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
884
|
+
HDLRuby::High.rcsim($top_system,"hruby_simulator",$output,$options[:vcd] && true)
|
885
|
+
HDLRuby.show "End of hybrid C-Ruby-level simulation..."
|
886
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
841
887
|
elsif $options[:vhdl] then
|
842
888
|
# top_system = $top_instance.to_low.systemT
|
843
889
|
# top_system = $top_system
|