HDLRuby 2.11.11 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.html +3274 -0
- data/README.md +608 -99
- data/ext/hruby_sim/hruby_rcsim_build.c +27 -0
- data/ext/hruby_sim/hruby_sim.h +3 -0
- data/ext/hruby_sim/hruby_sim_calc.c +2 -0
- data/ext/hruby_sim/hruby_sim_core.c +17 -5
- data/ext/hruby_sim/hruby_sim_stack_calc.c +1 -1
- data/ext/hruby_sim/hruby_sim_tree_calc.c +8 -1
- data/ext/hruby_sim/hruby_sim_vcd.c +24 -7
- data/ext/hruby_sim/hruby_sim_vizualize.c +9 -1
- data/lib/HDLRuby/backend/hruby_allocator.rb +2 -2
- data/lib/HDLRuby/backend/hruby_c_allocator.rb +7 -7
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +3 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +3 -1
- data/lib/HDLRuby/hdr_samples/huge_rom.rb +1 -1
- data/lib/HDLRuby/hdr_samples/mei8.rb +11 -11
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +12 -12
- data/lib/HDLRuby/hdr_samples/neg_arith_bench.rb +4 -4
- data/lib/HDLRuby/hdr_samples/rom_nest.rb +1 -1
- data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +4 -4
- data/lib/HDLRuby/hdr_samples/struct.rb +44 -10
- data/lib/HDLRuby/hdr_samples/with_bram.rb +45 -0
- data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +105 -0
- data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +69 -0
- data/lib/HDLRuby/hdr_samples/with_casts.rb +3 -3
- data/lib/HDLRuby/hdr_samples/with_concat.rb +6 -6
- data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -2
- data/lib/HDLRuby/hdr_samples/with_def.rb +10 -3
- data/lib/HDLRuby/hdr_samples/with_define_operator.rb +44 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +12 -12
- data/lib/HDLRuby/hdr_samples/with_init.rb +3 -3
- data/lib/HDLRuby/hdr_samples/with_leftright.rb +21 -0
- data/lib/HDLRuby/hdr_samples/with_reduce.rb +13 -13
- data/lib/HDLRuby/hdr_samples/with_ref_array.rb +6 -6
- data/lib/HDLRuby/hdr_samples/with_register_stack.rb +150 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer.rb +190 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_deep.rb +91 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +405 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +89 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +120 -0
- data/lib/HDLRuby/hdr_samples/with_subsums.rb +3 -3
- data/lib/HDLRuby/hdr_samples/with_terminate.rb +3 -3
- data/lib/HDLRuby/hdr_samples/with_to_a.rb +10 -10
- data/lib/HDLRuby/hdr_samples/with_values.rb +3 -3
- data/lib/HDLRuby/hdrcc.rb +29 -3
- data/lib/HDLRuby/hdrlib.rb +1 -1
- data/lib/HDLRuby/hruby_bstr.rb +10 -5
- data/lib/HDLRuby/hruby_db.rb +2 -2
- data/lib/HDLRuby/hruby_high.rb +152 -47
- data/lib/HDLRuby/hruby_high_fullname.rb +3 -1
- data/lib/HDLRuby/hruby_low.rb +189 -18
- data/lib/HDLRuby/hruby_low2c.rb +129 -54
- data/lib/HDLRuby/hruby_low2hdr.rb +66 -40
- data/lib/HDLRuby/hruby_low2high.rb +86 -44
- data/lib/HDLRuby/hruby_low2seq.rb +26 -18
- data/lib/HDLRuby/hruby_low2sym.rb +14 -13
- data/lib/HDLRuby/hruby_low2vhd.rb +80 -44
- data/lib/HDLRuby/hruby_low_bool2select.rb +61 -46
- data/lib/HDLRuby/hruby_low_casts_without_expression.rb +56 -44
- data/lib/HDLRuby/hruby_low_cleanup.rb +18 -16
- data/lib/HDLRuby/hruby_low_fix_types.rb +65 -32
- data/lib/HDLRuby/hruby_low_mutable.rb +83 -119
- data/lib/HDLRuby/hruby_low_resolve.rb +38 -30
- data/lib/HDLRuby/hruby_low_with_bool.rb +33 -16
- data/lib/HDLRuby/hruby_low_with_port.rb +3 -3
- data/lib/HDLRuby/hruby_low_with_var.rb +23 -9
- data/lib/HDLRuby/hruby_low_without_concat.rb +45 -19
- data/lib/HDLRuby/hruby_low_without_namespace.rb +47 -32
- data/lib/HDLRuby/hruby_low_without_parinseq.rb +32 -16
- data/lib/HDLRuby/hruby_low_without_select.rb +37 -24
- data/lib/HDLRuby/hruby_low_without_subsignals.rb +280 -0
- data/lib/HDLRuby/hruby_rcsim.rb +158 -134
- data/lib/HDLRuby/hruby_rsim.rb +194 -20
- data/lib/HDLRuby/hruby_rsim_mute.rb +2 -3
- data/lib/HDLRuby/hruby_rsim_vcd.rb +125 -50
- data/lib/HDLRuby/hruby_values.rb +48 -33
- data/lib/HDLRuby/hruby_verilog.rb +90 -48
- data/lib/HDLRuby/soft/stacks.rb +219 -0
- data/lib/HDLRuby/std/bram.rb +26 -0
- data/lib/HDLRuby/std/clocks.rb +1 -1
- data/lib/HDLRuby/std/fixpoint.rb +2 -2
- data/lib/HDLRuby/std/fsm.rb +48 -11
- data/lib/HDLRuby/std/function_generator.rb +2 -2
- data/lib/HDLRuby/std/sequencer.rb +1857 -0
- data/lib/HDLRuby/std/sequencer_sync.rb +400 -0
- data/lib/HDLRuby/std/std.rb +12 -0
- data/lib/HDLRuby/version.rb +1 -1
- data/tuto/adder_sat_flags_vcd.png +0 -0
- data/tuto/addsub_vcd.png +0 -0
- data/tuto/alu_vcd.png +0 -0
- data/tuto/bit_pong_vcd.png +0 -0
- data/tuto/checksum_vcd.png +0 -0
- data/tuto/circuit_hdr.odg +0 -0
- data/tuto/circuit_hdr.png +0 -0
- data/tuto/circuit_hie.odg +0 -0
- data/tuto/circuit_hie.png +0 -0
- data/tuto/circuit_view.odg +0 -0
- data/tuto/circuit_view.png +0 -0
- data/tuto/clock_counter_vcd.png +0 -0
- data/tuto/counter_ext_vcd.png +0 -0
- data/tuto/fact_vcd.png +0 -0
- data/tuto/hw_flow.odg +0 -0
- data/tuto/hw_flow.png +0 -0
- data/tuto/maxxer_vcd.png +0 -0
- data/tuto/pingpong0_vcd.png +0 -0
- data/tuto/pingpong1_vcd.png +0 -0
- data/tuto/pingpong2_vcd.png +0 -0
- data/tuto/ram_vcd.png +0 -0
- data/tuto/serializer_vcd.png +0 -0
- data/tuto/sw_flow.odg +0 -0
- data/tuto/sw_flow.png +0 -0
- data/tuto/the_counter_vcd.png +0 -0
- data/tuto/tutorial_sw.html +2359 -0
- data/tuto/tutorial_sw.md +2684 -0
- data/tuto/tutorial_sw.pdf +0 -0
- data/tuto/tutorial_sw_jp.md +417 -0
- metadata +49 -3
- data/lib/HDLRuby/hdr_samples/sumprod.rb +0 -29
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'soft/stacks.rb'
|
2
|
+
|
3
|
+
include HDLRuby::High::Soft
|
4
|
+
|
5
|
+
|
6
|
+
# A system testing the bram-based stack.
|
7
|
+
system :bram_stach_test do
|
8
|
+
|
9
|
+
widthD = 8
|
10
|
+
size = 1024
|
11
|
+
depth = 16
|
12
|
+
|
13
|
+
|
14
|
+
input :clk, :rst, :ce
|
15
|
+
[2].inner :cmd
|
16
|
+
{ frame: bit[depth.width], offset: bit[size.width] }.inner :loc
|
17
|
+
[size.width].inner :frame_size
|
18
|
+
[widthD].inner :din,:dout
|
19
|
+
inner :empty, :full
|
20
|
+
|
21
|
+
bram_frame_stack(widthD,size,depth).(:stack0).(clk,rst,ce,cmd,loc,din,dout,empty,full)
|
22
|
+
|
23
|
+
timed do
|
24
|
+
clk <= 0
|
25
|
+
rst <= 0
|
26
|
+
ce <= 0
|
27
|
+
cmd <= READ
|
28
|
+
loc.frame <= 0
|
29
|
+
loc.offset <= 0
|
30
|
+
frame_size <= 0
|
31
|
+
din <= 0
|
32
|
+
!10.ns
|
33
|
+
clk <= 1
|
34
|
+
!10.ns
|
35
|
+
clk <= 0
|
36
|
+
rst <= 1
|
37
|
+
!10.ns
|
38
|
+
clk <= 1
|
39
|
+
!10.ns
|
40
|
+
clk <= 0
|
41
|
+
rst <= 0
|
42
|
+
!10.ns
|
43
|
+
clk <= 1
|
44
|
+
repeat(9) do
|
45
|
+
!10.ns
|
46
|
+
clk <= 0
|
47
|
+
ce <= 1
|
48
|
+
cmd <= PUSH
|
49
|
+
frame_size <= frame_size + 16
|
50
|
+
loc.offset <= frame_size
|
51
|
+
!10.ns
|
52
|
+
clk <= 1
|
53
|
+
!10.ns
|
54
|
+
clk <= 0
|
55
|
+
cmd <= WRITE
|
56
|
+
din <= 5
|
57
|
+
loc.frame <= 0
|
58
|
+
loc.offset <= 1
|
59
|
+
!10.ns
|
60
|
+
clk <= 1
|
61
|
+
!10.ns
|
62
|
+
clk <= 0
|
63
|
+
cmd <= READ
|
64
|
+
loc.frame <= 0
|
65
|
+
loc.offset <= 1
|
66
|
+
!10.ns
|
67
|
+
clk <= 1
|
68
|
+
!10.ns
|
69
|
+
clk <= 0
|
70
|
+
cmd <= WRITE
|
71
|
+
din <= 55
|
72
|
+
loc.frame <= 1
|
73
|
+
loc.offset <= 14
|
74
|
+
!10.ns
|
75
|
+
clk <= 1
|
76
|
+
!10.ns
|
77
|
+
clk <= 0
|
78
|
+
cmd <= READ
|
79
|
+
loc.frame <= 1
|
80
|
+
loc.offset <= 14
|
81
|
+
!10.ns
|
82
|
+
clk <= 1
|
83
|
+
end
|
84
|
+
!10.ns
|
85
|
+
clk <= 0
|
86
|
+
ce <= 0
|
87
|
+
!10.ns
|
88
|
+
clk <= 1
|
89
|
+
repeat(9) do
|
90
|
+
!10.ns
|
91
|
+
clk <= 0
|
92
|
+
ce <= 1
|
93
|
+
cmd <= POP
|
94
|
+
!10.ns
|
95
|
+
clk <= 1
|
96
|
+
end
|
97
|
+
!10.ns
|
98
|
+
clk <= 0
|
99
|
+
ce <= 0
|
100
|
+
!10.ns
|
101
|
+
clk <= 1
|
102
|
+
!10.ns
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'soft/stacks.rb'
|
2
|
+
|
3
|
+
include HDLRuby::High::Soft
|
4
|
+
|
5
|
+
|
6
|
+
# A system testing the bram-based stack.
|
7
|
+
system :bram_stach_test do
|
8
|
+
|
9
|
+
size = 8
|
10
|
+
widthD = 8
|
11
|
+
|
12
|
+
|
13
|
+
input :clk, :rst, :ce
|
14
|
+
inner :cmd
|
15
|
+
[widthD].inner :din,:dout
|
16
|
+
inner :empty, :full
|
17
|
+
|
18
|
+
bram_stack(widthD,size).(:stack0).(clk,rst,ce,cmd,din,dout,empty,full)
|
19
|
+
|
20
|
+
timed do
|
21
|
+
clk <= 0
|
22
|
+
rst <= 0
|
23
|
+
ce <= 0
|
24
|
+
cmd <= PUSH
|
25
|
+
din <= 0
|
26
|
+
!10.ns
|
27
|
+
clk <= 1
|
28
|
+
!10.ns
|
29
|
+
clk <= 0
|
30
|
+
rst <= 1
|
31
|
+
!10.ns
|
32
|
+
clk <= 1
|
33
|
+
!10.ns
|
34
|
+
clk <= 0
|
35
|
+
rst <= 0
|
36
|
+
din <= 0
|
37
|
+
!10.ns
|
38
|
+
clk <= 1
|
39
|
+
repeat(9) do
|
40
|
+
!10.ns
|
41
|
+
clk <= 0
|
42
|
+
ce <= 1
|
43
|
+
cmd <= PUSH
|
44
|
+
din <= din + 1
|
45
|
+
!10.ns
|
46
|
+
clk <= 1
|
47
|
+
end
|
48
|
+
!10.ns
|
49
|
+
clk <= 0
|
50
|
+
ce <= 0
|
51
|
+
!10.ns
|
52
|
+
clk <= 1
|
53
|
+
repeat(9) do
|
54
|
+
!10.ns
|
55
|
+
clk <= 0
|
56
|
+
ce <= 1
|
57
|
+
cmd <= POP
|
58
|
+
!10.ns
|
59
|
+
clk <= 1
|
60
|
+
end
|
61
|
+
!10.ns
|
62
|
+
clk <= 0
|
63
|
+
ce <= 0
|
64
|
+
!10.ns
|
65
|
+
clk <= 1
|
66
|
+
!10.ns
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -10,16 +10,16 @@ system :with_concat do
|
|
10
10
|
val3 <= [val2,val0]
|
11
11
|
|
12
12
|
timed do
|
13
|
-
val0 <=
|
14
|
-
val1 <=
|
13
|
+
val0 <= _b1111
|
14
|
+
val1 <= _b0000
|
15
15
|
count <= 0
|
16
16
|
!10.ns
|
17
|
-
val0 <=
|
18
|
-
val1 <=
|
17
|
+
val0 <= _b1001
|
18
|
+
val1 <= _b0110
|
19
19
|
count <= 1
|
20
20
|
!10.ns
|
21
|
-
val0 <=
|
22
|
-
val1 <=
|
21
|
+
val0 <= _b1010
|
22
|
+
val1 <= _b0101
|
23
23
|
count <= 2
|
24
24
|
!10.ns
|
25
25
|
end
|
@@ -12,8 +12,8 @@ system :channel_connector do
|
|
12
12
|
address_width = 4 # lutのアドレスのビット幅
|
13
13
|
typ = signed[integer_width + decimal_width] # データ型
|
14
14
|
|
15
|
-
inputs_x =
|
16
|
-
inputs_h =
|
15
|
+
inputs_x = _b00010011
|
16
|
+
inputs_h = _b10100001
|
17
17
|
columns = [2, 2, 1]
|
18
18
|
|
19
19
|
inner :clk, # clock
|
@@ -9,11 +9,18 @@ end
|
|
9
9
|
system :def_bench do
|
10
10
|
|
11
11
|
[2].inner :addr
|
12
|
-
[8].inner :val0, :val1
|
12
|
+
[8].inner :val0, :val1, :val2, :val3
|
13
13
|
|
14
14
|
par do
|
15
|
-
val0 <= lut84([
|
16
|
-
val1 <= lut84([
|
15
|
+
val0 <= lut84([_b8d0,_b8d1,_b8d4,_b8d9],addr)
|
16
|
+
val1 <= lut84([_b8d0,_b8d1,_b8d4,_b8d9],3-addr)
|
17
|
+
end
|
18
|
+
|
19
|
+
bit[8][-4].inner otbl: [_b8d0,_b8d1,_b8d4,_b8d9]
|
20
|
+
|
21
|
+
par do
|
22
|
+
val2 <= otbl[addr]
|
23
|
+
val3 <= otbl[3-addr]
|
17
24
|
end
|
18
25
|
|
19
26
|
timed do
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# A sample for testing define operator.
|
2
|
+
|
3
|
+
typedef :sat100 do |width|
|
4
|
+
signed[width]
|
5
|
+
end
|
6
|
+
|
7
|
+
sat100.define_operator(:+) do |width, x,y|
|
8
|
+
tmp = x.as(bit[width]) + y.as(bit[width])
|
9
|
+
mux(tmp > 100,tmp,100)
|
10
|
+
end
|
11
|
+
|
12
|
+
typedef :sat do |width, max|
|
13
|
+
signed[width]
|
14
|
+
end
|
15
|
+
|
16
|
+
sat.define_operator(:+) do |width,max, x,y|
|
17
|
+
tmp = x.as(bit[width]) + y.as(bit[width])
|
18
|
+
mux(tmp > max, tmp, max)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
system :bench_sat do
|
23
|
+
sat100(8).inner :x,:y,:z
|
24
|
+
sat(8,55).inner :u,:v,:w
|
25
|
+
|
26
|
+
timed do
|
27
|
+
x <= 40
|
28
|
+
y <= 32
|
29
|
+
z <= x+y
|
30
|
+
!10.ns
|
31
|
+
u <= 20
|
32
|
+
v <= 24
|
33
|
+
w <= u+v
|
34
|
+
!10.ns
|
35
|
+
x <= 70
|
36
|
+
y <= 32
|
37
|
+
z <= x+y
|
38
|
+
!10.ns
|
39
|
+
u <= 50
|
40
|
+
v <= 24
|
41
|
+
w <= u+v
|
42
|
+
!10.ns
|
43
|
+
end
|
44
|
+
end
|
@@ -14,9 +14,9 @@ system :fix_test do
|
|
14
14
|
|
15
15
|
# Performs calculation between then
|
16
16
|
timed do
|
17
|
-
# x <=
|
17
|
+
# x <= _b00110011 # 3.1875
|
18
18
|
x <= 3.1875.to_fix(4)
|
19
|
-
y <=
|
19
|
+
y <= _b01000000 # 4
|
20
20
|
!10.ns
|
21
21
|
z <= x + y
|
22
22
|
!10.ns
|
@@ -24,8 +24,8 @@ system :fix_test do
|
|
24
24
|
!10.ns
|
25
25
|
z <= z / x
|
26
26
|
!10.ns
|
27
|
-
a <=
|
28
|
-
b <=
|
27
|
+
a <= _b00010000
|
28
|
+
b <= _b00001111
|
29
29
|
!10.ns
|
30
30
|
c <= a * b
|
31
31
|
d <= 0
|
@@ -49,15 +49,15 @@ system :fix_test do
|
|
49
49
|
!10.ns
|
50
50
|
c <= a * b
|
51
51
|
!10.ns
|
52
|
-
# a <=
|
53
|
-
# b <=
|
54
|
-
a <=
|
55
|
-
b <=
|
52
|
+
# a <= _b00010000
|
53
|
+
# b <= _b00010101
|
54
|
+
a <= _sb0000111x
|
55
|
+
b <= _sb1110011x
|
56
56
|
!10.ns
|
57
|
-
# a <= a &
|
58
|
-
# b <= b |
|
59
|
-
a <= a |
|
60
|
-
b <= b |
|
57
|
+
# a <= a & _b11111110
|
58
|
+
# b <= b | _b00000001
|
59
|
+
a <= a | _b00000001
|
60
|
+
b <= b | _b00000001
|
61
61
|
!10.ns
|
62
62
|
c <= a * b
|
63
63
|
!10.ns
|
@@ -2,9 +2,9 @@
|
|
2
2
|
# A benchmark for testing the initialization of signals.
|
3
3
|
system :with_init do
|
4
4
|
[8].constant cst0: 127
|
5
|
-
constant cst1:
|
6
|
-
[8].inner sig0:
|
7
|
-
inner sig1:
|
5
|
+
constant cst1: _b1
|
6
|
+
[8].inner sig0: _b10000000
|
7
|
+
inner sig1: _b1
|
8
8
|
[8].inner :sig2
|
9
9
|
|
10
10
|
timed do
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# A benchmark for the cases where a left value is also a right value
|
2
|
+
# in a block without sensitivity list.
|
3
|
+
system :leftright_bench do
|
4
|
+
[8].inner :l,:r0,:r1,:lr
|
5
|
+
|
6
|
+
par do
|
7
|
+
lr <= r0*2
|
8
|
+
l <= [lr[7],lr[6..0]].to_expr + r1
|
9
|
+
end
|
10
|
+
|
11
|
+
timed do
|
12
|
+
!10.ns
|
13
|
+
r0 <= 1
|
14
|
+
!10.ns
|
15
|
+
r1 <= 2
|
16
|
+
!10.ns
|
17
|
+
r0 <= 3
|
18
|
+
r1 <= 4
|
19
|
+
!10.ns
|
20
|
+
end
|
21
|
+
end
|
@@ -6,33 +6,33 @@ system :with_reduce_bench do
|
|
6
6
|
[64].inner :val64
|
7
7
|
|
8
8
|
timed do
|
9
|
-
val <=
|
10
|
-
res <= val.reduce(
|
9
|
+
val <= _b01101010
|
10
|
+
res <= val.reduce(_b00000000,:+)
|
11
11
|
!10.ns
|
12
12
|
val <= _01010010
|
13
|
-
res <= val.reduce(
|
13
|
+
res <= val.reduce(_b00000000,:+)
|
14
14
|
!10.ns
|
15
15
|
val <= _01101111
|
16
|
-
res <= val.reduce(
|
16
|
+
res <= val.reduce(_b00000000,:+)
|
17
17
|
!10.ns
|
18
|
-
val64 <=
|
19
|
-
res <= val64.reduce(
|
18
|
+
val64 <= _b0110101001101010011010100110101001101010011010100110101001101010
|
19
|
+
res <= val64.reduce(_b00000000,:+)
|
20
20
|
!10.ns
|
21
21
|
res <= val64[7..0]
|
22
22
|
!10.ns
|
23
|
-
res <= res.reduce(
|
23
|
+
res <= res.reduce(_b00000000,:+)
|
24
24
|
!10.ns
|
25
25
|
res <= val64[63..60]
|
26
26
|
!10.ns
|
27
|
-
res <= res.reduce(
|
27
|
+
res <= res.reduce(_b00000000,:+)
|
28
28
|
!10.ns
|
29
29
|
val64 <= ~(val64 ^ val64)
|
30
|
-
res <= val64.reduce(
|
30
|
+
res <= val64.reduce(_b00000000,:+)
|
31
31
|
!10.ns
|
32
|
-
val64[0] <=
|
33
|
-
val64[3] <=
|
34
|
-
val64[63] <=
|
35
|
-
res <= val64.reduce(
|
32
|
+
val64[0] <= _b0
|
33
|
+
val64[3] <= _b0
|
34
|
+
val64[63] <= _b0
|
35
|
+
res <= val64.reduce(_b00000000,:+)
|
36
36
|
!10.ns
|
37
37
|
end
|
38
38
|
end
|
@@ -10,16 +10,16 @@ system :with_concat do
|
|
10
10
|
val3[6..3] <= val1[7..4]
|
11
11
|
|
12
12
|
timed do
|
13
|
-
val0 <=
|
14
|
-
val1 <=
|
13
|
+
val0 <= _b00001111
|
14
|
+
val1 <= _b11000011
|
15
15
|
count <= 0
|
16
16
|
!10.ns
|
17
|
-
val0 <=
|
18
|
-
val1 <=
|
17
|
+
val0 <= _b11110000
|
18
|
+
val1 <= _b00111100
|
19
19
|
count <= 1
|
20
20
|
!10.ns
|
21
|
-
val0 <=
|
22
|
-
val1 <=
|
21
|
+
val0 <= _b10101010
|
22
|
+
val1 <= _b01010101
|
23
23
|
count <= 2
|
24
24
|
!10.ns
|
25
25
|
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'soft/stacks.rb'
|
2
|
+
|
3
|
+
include HDLRuby::High::Soft
|
4
|
+
|
5
|
+
|
6
|
+
# A system testing the bram-based stack.
|
7
|
+
system :register_stack_test do
|
8
|
+
|
9
|
+
widthA = 3
|
10
|
+
size = 2**widthA
|
11
|
+
widthD = 8
|
12
|
+
|
13
|
+
|
14
|
+
input :clk,:rst,:ce
|
15
|
+
[2].inner :cmd
|
16
|
+
[widthD].inner :din,:dout
|
17
|
+
inner :empty, :full
|
18
|
+
douts = size.times.map { |i| [widthD].inner :"dout#{i}" }
|
19
|
+
|
20
|
+
register_stack(widthA,widthD,size).(:stackI).(clk,rst,ce,cmd,din,dout,empty,full,*douts)
|
21
|
+
|
22
|
+
[widthD].inner :count # Additional counter for the test.
|
23
|
+
|
24
|
+
timed do
|
25
|
+
clk <= 0
|
26
|
+
ce <= 0
|
27
|
+
rst <= 0
|
28
|
+
cmd <= READ
|
29
|
+
din <= 0
|
30
|
+
!10.ns
|
31
|
+
clk <= 1
|
32
|
+
!10.ns
|
33
|
+
clk <= 0
|
34
|
+
rst <= 1
|
35
|
+
!10.ns
|
36
|
+
clk <= 1
|
37
|
+
!10.ns
|
38
|
+
clk <= 0
|
39
|
+
rst <= 0
|
40
|
+
ce <= 1
|
41
|
+
din <= 1
|
42
|
+
!10.ns
|
43
|
+
clk <= 1
|
44
|
+
repeat(9) do
|
45
|
+
!10.ns
|
46
|
+
clk <= 0
|
47
|
+
cmd <= PUSH
|
48
|
+
din <= din + 1
|
49
|
+
!10.ns
|
50
|
+
clk <= 1
|
51
|
+
end
|
52
|
+
!10.ns
|
53
|
+
clk <= 0
|
54
|
+
!10.ns
|
55
|
+
clk <= 1
|
56
|
+
din <= -1
|
57
|
+
repeat(8) do
|
58
|
+
!10.ns
|
59
|
+
clk <= 0
|
60
|
+
cmd <= READ
|
61
|
+
din <= din + 1
|
62
|
+
!10.ns
|
63
|
+
clk <= 1
|
64
|
+
end
|
65
|
+
!10.ns
|
66
|
+
clk <= 0
|
67
|
+
!10.ns
|
68
|
+
clk <= 1
|
69
|
+
count <= 0
|
70
|
+
repeat(4) do
|
71
|
+
!10.ns
|
72
|
+
clk <= 0
|
73
|
+
din <= 1
|
74
|
+
cmd <= POP
|
75
|
+
!10.ns
|
76
|
+
clk <= 1
|
77
|
+
!10.ns
|
78
|
+
clk <= 0
|
79
|
+
count <= count + 1
|
80
|
+
din <= count
|
81
|
+
cmd <= PUSH
|
82
|
+
!10.ns
|
83
|
+
clk <= 1
|
84
|
+
end
|
85
|
+
!10.ns
|
86
|
+
clk <= 0
|
87
|
+
!10.ns
|
88
|
+
clk <= 1
|
89
|
+
repeat(9) do
|
90
|
+
!10.ns
|
91
|
+
clk <= 0
|
92
|
+
din <= 1
|
93
|
+
cmd <= POP
|
94
|
+
!10.ns
|
95
|
+
clk <= 1
|
96
|
+
end
|
97
|
+
!10.ns
|
98
|
+
clk <= 0
|
99
|
+
din <= _b8hAA
|
100
|
+
cmd <= PUSH
|
101
|
+
!10.ns
|
102
|
+
clk <= 1
|
103
|
+
!10.ns
|
104
|
+
clk <= 0
|
105
|
+
din <= 7
|
106
|
+
cmd <= WRITE
|
107
|
+
!10.ns
|
108
|
+
clk <= 1
|
109
|
+
din <= -1
|
110
|
+
repeat(8) do
|
111
|
+
!10.ns
|
112
|
+
clk <= 0
|
113
|
+
cmd <= WRITE
|
114
|
+
din <= din + 1
|
115
|
+
!10.ns
|
116
|
+
clk <= 1
|
117
|
+
end
|
118
|
+
!10.ns
|
119
|
+
clk <= 0
|
120
|
+
din <= size-1
|
121
|
+
cmd <= READ
|
122
|
+
!10.ns
|
123
|
+
clk <= 1
|
124
|
+
!10.ns
|
125
|
+
clk <= 0
|
126
|
+
din <= -3
|
127
|
+
cmd <= POP
|
128
|
+
!10.ns
|
129
|
+
clk <= 1
|
130
|
+
!10.ns
|
131
|
+
clk <= 0
|
132
|
+
din <= 31
|
133
|
+
cmd <= PUSH
|
134
|
+
!10.ns
|
135
|
+
clk <= 1
|
136
|
+
!10.ns
|
137
|
+
clk <= 0
|
138
|
+
din <= 3
|
139
|
+
cmd <= POP
|
140
|
+
!10.ns
|
141
|
+
clk <= 1
|
142
|
+
!10.ns
|
143
|
+
clk <= 0
|
144
|
+
din <= size-1
|
145
|
+
cmd <= READ
|
146
|
+
!10.ns
|
147
|
+
clk <= 1
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|