rggen-systemverilog 0.22.0 → 0.25.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +2 -2
- data/lib/rggen/systemverilog/common.rb +0 -24
- data/lib/rggen/systemverilog/common/factories.rb +1 -1
- data/lib/rggen/systemverilog/common/feature.rb +3 -3
- data/lib/rggen/systemverilog/common/utility.rb +5 -1
- data/lib/rggen/systemverilog/common/utility/class_definition.rb +12 -4
- data/lib/rggen/systemverilog/common/utility/data_object.rb +1 -2
- data/lib/rggen/systemverilog/common/utility/function_definition.rb +16 -4
- data/lib/rggen/systemverilog/common/utility/identifier.rb +32 -23
- data/lib/rggen/systemverilog/common/utility/local_scope.rb +9 -7
- data/lib/rggen/systemverilog/common/utility/module_definition.rb +12 -4
- data/lib/rggen/systemverilog/common/utility/package_definition.rb +4 -4
- data/lib/rggen/systemverilog/ral.rb +20 -28
- data/lib/rggen/systemverilog/ral/bit_field/type.rb +2 -2
- data/lib/rggen/systemverilog/ral/bit_field/type/rof.rb +5 -0
- data/lib/rggen/systemverilog/ral/setup.rb +1 -1
- data/lib/rggen/systemverilog/rtl.rb +37 -44
- data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +11 -47
- data/lib/rggen/systemverilog/rtl/bit_field/type.rb +1 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.erb +19 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.rb +54 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro.erb +15 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +15 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.erb +19 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.rb +44 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.erb +15 -7
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +3 -3
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.erb +15 -7
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.erb +18 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.rb +34 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rws.erb +13 -7
- data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.erb +19 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +37 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.erb +16 -8
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.rb +6 -3
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.erb +18 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/{w0src_w1src.rb → wrc_wrs.rb} +7 -5
- data/lib/rggen/systemverilog/rtl/bit_field_index.rb +52 -0
- data/lib/rggen/systemverilog/rtl/feature.rb +8 -6
- data/lib/rggen/systemverilog/rtl/indirect_index.rb +35 -0
- data/lib/rggen/systemverilog/rtl/partial_sum.rb +5 -6
- data/lib/rggen/systemverilog/rtl/register/type.rb +1 -56
- data/lib/rggen/systemverilog/rtl/register/type/external.rb +8 -20
- data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +2 -26
- data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +14 -8
- data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +10 -10
- data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +52 -50
- data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +3 -7
- data/lib/rggen/systemverilog/rtl/register_index.rb +17 -15
- data/lib/rggen/systemverilog/rtl/register_type.rb +69 -0
- data/lib/rggen/systemverilog/rtl/setup.rb +1 -1
- data/lib/rggen/systemverilog/version.rb +1 -1
- metadata +19 -48
- data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +0 -5
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.erb +0 -15
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +0 -43
- data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +0 -3
- data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +0 -7
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.erb +0 -13
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +0 -32
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.erb +0 -10
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +0 -26
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.erb +0 -10
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +0 -26
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.erb +0 -10
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.rb +0 -21
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0src_w1src.erb +0 -10
@@ -29,12 +29,12 @@ RgGen.define_list_feature(:bit_field, :type) do
|
|
29
29
|
|
30
30
|
def model_name
|
31
31
|
name = helper.model_name
|
32
|
-
name
|
32
|
+
name.is_a?(Proc) && instance_eval(&name) || name || 'rggen_ral_field'
|
33
33
|
end
|
34
34
|
|
35
35
|
def constructors
|
36
36
|
(bit_field.sequence_size&.times || [nil]).map do |index|
|
37
|
-
macro_call(
|
37
|
+
macro_call('rggen_ral_create_field', arguments(index))
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'rggen/systemverilog/ral'
|
4
4
|
|
5
|
-
RgGen.
|
5
|
+
RgGen.register_plugin RgGen::SystemVerilog::RAL do |builder|
|
6
6
|
builder.enable :register_block, [:sv_ral_model, :sv_ral_package]
|
7
7
|
builder.enable :register_file, [:sv_ral_model]
|
8
8
|
end
|
@@ -4,57 +4,50 @@ require_relative 'common'
|
|
4
4
|
require_relative 'rtl/feature'
|
5
5
|
require_relative 'rtl/partial_sum'
|
6
6
|
require_relative 'rtl/register_index'
|
7
|
+
require_relative 'rtl/register_type'
|
8
|
+
require_relative 'rtl/indirect_index'
|
9
|
+
require_relative 'rtl/bit_field_index'
|
7
10
|
|
8
11
|
module RgGen
|
9
12
|
module SystemVerilog
|
10
13
|
module RTL
|
11
|
-
|
14
|
+
extend Core::Plugin
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
'rtl/bit_field/type',
|
16
|
-
'rtl/bit_field/type/rc_w0c_w1c',
|
17
|
-
'rtl/bit_field/type/reserved',
|
18
|
-
'rtl/bit_field/type/ro',
|
19
|
-
'rtl/bit_field/type/rof',
|
20
|
-
'rtl/bit_field/type/rs_w0s_w1s',
|
21
|
-
'rtl/bit_field/type/rw_w1_wo_wo1',
|
22
|
-
'rtl/bit_field/type/rwc',
|
23
|
-
'rtl/bit_field/type/rwe',
|
24
|
-
'rtl/bit_field/type/rwl',
|
25
|
-
'rtl/bit_field/type/rws',
|
26
|
-
'rtl/bit_field/type/w0crs_w1crs',
|
27
|
-
'rtl/bit_field/type/w0src_w1src',
|
28
|
-
'rtl/bit_field/type/w0t_w1t',
|
29
|
-
'rtl/bit_field/type/w0trg_w1trg',
|
30
|
-
'rtl/global/array_port_format',
|
31
|
-
'rtl/global/fold_sv_interface_port',
|
32
|
-
'rtl/register/sv_rtl_top',
|
33
|
-
'rtl/register/type',
|
34
|
-
'rtl/register/type/external',
|
35
|
-
'rtl/register/type/indirect',
|
36
|
-
'rtl/register_block/protocol',
|
37
|
-
'rtl/register_block/protocol/apb',
|
38
|
-
'rtl/register_block/protocol/axi4lite',
|
39
|
-
'rtl/register_block/sv_rtl_top',
|
40
|
-
'rtl/register_file/sv_rtl_top'
|
41
|
-
].freeze
|
16
|
+
setup_plugin :'rggen-sv-rtl' do |plugin|
|
17
|
+
plugin.version SystemVerilog::VERSION
|
42
18
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
def self.register_component(builder)
|
48
|
-
Common.register_component(builder, :sv_rtl, Feature)
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.load_features
|
52
|
-
Common.load_features(FEATURES, __dir__)
|
53
|
-
end
|
19
|
+
plugin.register_component :sv_rtl do
|
20
|
+
component Common::Component, Common::ComponentFactory
|
21
|
+
feature Feature, Common::FeatureFactory
|
22
|
+
end
|
54
23
|
|
55
|
-
|
56
|
-
|
57
|
-
|
24
|
+
plugin.files [
|
25
|
+
'rtl/bit_field/sv_rtl_top',
|
26
|
+
'rtl/bit_field/type',
|
27
|
+
'rtl/bit_field/type/rc_w0c_w1c_wc_woc',
|
28
|
+
'rtl/bit_field/type/ro',
|
29
|
+
'rtl/bit_field/type/rof',
|
30
|
+
'rtl/bit_field/type/rs_w0s_w1s_ws_wos',
|
31
|
+
'rtl/bit_field/type/rw_w1_wo_wo1',
|
32
|
+
'rtl/bit_field/type/rwc',
|
33
|
+
'rtl/bit_field/type/rwe_rwl',
|
34
|
+
'rtl/bit_field/type/rws',
|
35
|
+
'rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc',
|
36
|
+
'rtl/bit_field/type/w0t_w1t',
|
37
|
+
'rtl/bit_field/type/w0trg_w1trg',
|
38
|
+
'rtl/bit_field/type/wrc_wrs',
|
39
|
+
'rtl/global/array_port_format',
|
40
|
+
'rtl/global/fold_sv_interface_port',
|
41
|
+
'rtl/register/sv_rtl_top',
|
42
|
+
'rtl/register/type',
|
43
|
+
'rtl/register/type/external',
|
44
|
+
'rtl/register/type/indirect',
|
45
|
+
'rtl/register_block/protocol',
|
46
|
+
'rtl/register_block/protocol/apb',
|
47
|
+
'rtl/register_block/protocol/axi4lite',
|
48
|
+
'rtl/register_block/sv_rtl_top',
|
49
|
+
'rtl/register_file/sv_rtl_top'
|
50
|
+
]
|
58
51
|
end
|
59
52
|
end
|
60
53
|
end
|
@@ -2,10 +2,8 @@
|
|
2
2
|
|
3
3
|
RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
4
4
|
sv_rtl do
|
5
|
-
|
6
|
-
|
7
|
-
export :loop_variables
|
8
|
-
export :array_size
|
5
|
+
include RgGen::SystemVerilog::RTL::BitFieldIndex
|
6
|
+
|
9
7
|
export :value
|
10
8
|
|
11
9
|
build do
|
@@ -13,13 +11,13 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
13
11
|
localparam :initial_value, {
|
14
12
|
name: initial_value_name, data_type: :bit, width: bit_field.width,
|
15
13
|
array_size: initial_value_size, array_format: initial_value_format,
|
16
|
-
default:
|
14
|
+
default: initial_value_rhs
|
17
15
|
}
|
18
16
|
elsif initial_value?
|
19
17
|
parameter :initial_value, {
|
20
18
|
name: initial_value_name, data_type: :bit, width: bit_field.width,
|
21
19
|
array_size: initial_value_size, array_format: initial_value_format,
|
22
|
-
default:
|
20
|
+
default: initial_value_rhs
|
23
21
|
}
|
24
22
|
end
|
25
23
|
interface :bit_field_sub_if, {
|
@@ -42,31 +40,8 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
42
40
|
code << bit_field_if_connection << nl
|
43
41
|
end
|
44
42
|
|
45
|
-
def local_index
|
46
|
-
(index_name = local_index_name) &&
|
47
|
-
create_identifier(index_name)
|
48
|
-
end
|
49
|
-
|
50
|
-
def local_indices
|
51
|
-
[*register.local_indices, local_index_name]
|
52
|
-
end
|
53
|
-
|
54
|
-
def loop_variables
|
55
|
-
(inside_loop? || nil) &&
|
56
|
-
[*register.loop_variables, local_index].compact
|
57
|
-
end
|
58
|
-
|
59
|
-
def array_size
|
60
|
-
(inside_loop? || nil) &&
|
61
|
-
[
|
62
|
-
*register_files.flat_map(&:array_size),
|
63
|
-
*register.array_size,
|
64
|
-
*bit_field.sequence_size
|
65
|
-
].compact
|
66
|
-
end
|
67
|
-
|
68
43
|
def value(offsets = nil, width = nil)
|
69
|
-
value_lsb = bit_field.lsb(offsets&.last ||
|
44
|
+
value_lsb = bit_field.lsb(offsets&.last || local_index)
|
70
45
|
value_width = width || bit_field.width
|
71
46
|
register_if(offsets&.slice(0..-2)).value[value_lsb, value_width]
|
72
47
|
end
|
@@ -77,14 +52,6 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
77
52
|
define_method(m) { bit_field.__send__(__method__) }
|
78
53
|
end
|
79
54
|
|
80
|
-
def local_index_name
|
81
|
-
(bit_field.sequential? || nil) &&
|
82
|
-
begin
|
83
|
-
depth = (register.loop_variables&.size || 0) + 1
|
84
|
-
loop_index(depth)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
55
|
def register_if(offsets)
|
89
56
|
index = register.index(offsets || register.local_indices)
|
90
57
|
register_block.register_if[index]
|
@@ -106,11 +73,11 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
106
73
|
configuration.array_port_format
|
107
74
|
end
|
108
75
|
|
109
|
-
def
|
110
|
-
initial_value_array? &&
|
76
|
+
def initial_value_rhs
|
77
|
+
initial_value_array? && initial_value_array_rhs || sized_initial_value
|
111
78
|
end
|
112
79
|
|
113
|
-
def
|
80
|
+
def initial_value_array_rhs
|
114
81
|
if fixed_initial_value?
|
115
82
|
array(sized_initial_values)
|
116
83
|
elsif initial_value_format == :unpacked
|
@@ -129,12 +96,9 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
129
96
|
bit_field.initial_values&.map { |v| hex(v, bit_field.width) }
|
130
97
|
end
|
131
98
|
|
132
|
-
def inside_loop?
|
133
|
-
register.array? || bit_field.sequential?
|
134
|
-
end
|
135
|
-
|
136
99
|
def loop_size
|
137
|
-
|
100
|
+
loop_variable = local_index
|
101
|
+
loop_variable &&
|
138
102
|
{ loop_variable => bit_field.sequence_size }
|
139
103
|
end
|
140
104
|
|
@@ -152,7 +116,7 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
152
116
|
|
153
117
|
def bit_field_if_connection
|
154
118
|
macro_call(
|
155
|
-
|
119
|
+
'rggen_connect_bit_field_if',
|
156
120
|
[
|
157
121
|
register.bit_field_if,
|
158
122
|
bit_field.bit_field_sub_if,
|
@@ -0,0 +1,19 @@
|
|
1
|
+
rggen_bit_field #(
|
2
|
+
.WIDTH (<%= width %>),
|
3
|
+
.INITIAL_VALUE (<%= initial_value %>),
|
4
|
+
.SW_READ_ACTION (<%= read_action %>),
|
5
|
+
.SW_WRITE_ACTION (<%= write_action %>)
|
6
|
+
) u_bit_field (
|
7
|
+
.i_clk (<%= clock %>),
|
8
|
+
.i_rst_n (<%= reset %>),
|
9
|
+
.bit_field_if (<%= bit_field_if %>),
|
10
|
+
.i_sw_write_enable (<%= write_enable %>),
|
11
|
+
.i_hw_write_enable ('0),
|
12
|
+
.i_hw_write_data ('0),
|
13
|
+
.i_hw_set (<%= set[loop_variables] %>),
|
14
|
+
.i_hw_clear ('0),
|
15
|
+
.i_value ('0),
|
16
|
+
.i_mask (<%= mask %>),
|
17
|
+
.o_value (<%= value_out[loop_variables] %>),
|
18
|
+
.o_value_unmasked (<%= value_out_unmasked %>)
|
19
|
+
);
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:rc, :w0c, :w1c, :wc, :woc]) do
|
4
|
+
sv_rtl do
|
5
|
+
build do
|
6
|
+
input :set, {
|
7
|
+
name: "i_#{full_name}_set", width: width,
|
8
|
+
array_size: array_size, array_format: array_port_format
|
9
|
+
}
|
10
|
+
output :value_out, {
|
11
|
+
name: "o_#{full_name}", width: width,
|
12
|
+
array_size: array_size, array_format: array_port_format
|
13
|
+
}
|
14
|
+
if bit_field.reference?
|
15
|
+
output :value_unmasked, {
|
16
|
+
name: "o_#{full_name}_unmasked", width: width,
|
17
|
+
array_size: array_size, array_format: array_port_format
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
main_code :bit_field, from_template: true
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def read_action
|
27
|
+
{
|
28
|
+
rc: 'RGGEN_READ_CLEAR',
|
29
|
+
w0c: 'RGGEN_READ_DEFAULT',
|
30
|
+
w1c: 'RGGEN_READ_DEFAULT',
|
31
|
+
wc: 'RGGEN_READ_DEFAULT',
|
32
|
+
woc: 'RGGEN_READ_NONE'
|
33
|
+
}[bit_field.type]
|
34
|
+
end
|
35
|
+
|
36
|
+
def write_action
|
37
|
+
{
|
38
|
+
rc: 'RGGEN_WRITE_NONE',
|
39
|
+
w0c: 'RGGEN_WRITE_0_CLEAR',
|
40
|
+
w1c: 'RGGEN_WRITE_1_CLEAR',
|
41
|
+
wc: 'RGGEN_WRITE_CLEAR',
|
42
|
+
woc: 'RGGEN_WRITE_CLEAR'
|
43
|
+
}[bit_field.type]
|
44
|
+
end
|
45
|
+
|
46
|
+
def write_enable
|
47
|
+
bit_field.writable? && all_bits_1 || all_bits_0
|
48
|
+
end
|
49
|
+
|
50
|
+
def value_out_unmasked
|
51
|
+
(bit_field.reference? || nil) && value_unmasked[loop_variables]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,6 +1,17 @@
|
|
1
|
-
|
2
|
-
.WIDTH
|
1
|
+
rggen_bit_field #(
|
2
|
+
.WIDTH (<%= width %>),
|
3
|
+
.STORAGE (0)
|
3
4
|
) u_bit_field (
|
4
|
-
.
|
5
|
-
.
|
5
|
+
.i_clk ('0),
|
6
|
+
.i_rst_n ('0),
|
7
|
+
.bit_field_if (<%= bit_field_if %>),
|
8
|
+
.i_sw_write_enable ('0),
|
9
|
+
.i_hw_write_enable ('0),
|
10
|
+
.i_hw_write_data ('0),
|
11
|
+
.i_hw_set ('0),
|
12
|
+
.i_hw_clear ('0),
|
13
|
+
.i_value (<%= reference_or_value_in %>),
|
14
|
+
.i_mask ('1),
|
15
|
+
.o_value (),
|
16
|
+
.o_value_unmasked ()
|
6
17
|
);
|
@@ -5,7 +5,7 @@ RgGen.define_list_item_feature(:bit_field, :type, :ro) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :value_in, {
|
8
|
-
name: "i_#{full_name}",
|
8
|
+
name: "i_#{full_name}", width: width,
|
9
9
|
array_size: array_size, array_format: array_port_format
|
10
10
|
}
|
11
11
|
end
|
@@ -1,6 +1,17 @@
|
|
1
|
-
|
2
|
-
.WIDTH
|
1
|
+
rggen_bit_field #(
|
2
|
+
.WIDTH (<%= width %>),
|
3
|
+
.STORAGE (0)
|
3
4
|
) u_bit_field (
|
4
|
-
.
|
5
|
-
.
|
5
|
+
.i_clk ('0),
|
6
|
+
.i_rst_n ('0),
|
7
|
+
.bit_field_if (<%= bit_field_if %>),
|
8
|
+
.i_sw_write_enable ('0),
|
9
|
+
.i_hw_write_enable ('0),
|
10
|
+
.i_hw_write_data ('0),
|
11
|
+
.i_hw_set ('0),
|
12
|
+
.i_hw_clear ('0),
|
13
|
+
.i_value (<%= initial_value %>),
|
14
|
+
.i_mask ('1),
|
15
|
+
.o_value (),
|
16
|
+
.o_value_unmasked ()
|
6
17
|
);
|
@@ -0,0 +1,19 @@
|
|
1
|
+
rggen_bit_field #(
|
2
|
+
.WIDTH (<%= width %>),
|
3
|
+
.INITIAL_VALUE (<%= initial_value %>),
|
4
|
+
.SW_READ_ACTION (<%= read_action %>),
|
5
|
+
.SW_WRITE_ACTION (<%= write_action %>)
|
6
|
+
) u_bit_field (
|
7
|
+
.i_clk (<%= clock %>),
|
8
|
+
.i_rst_n (<%= reset %>),
|
9
|
+
.bit_field_if (<%= bit_field_if %>),
|
10
|
+
.i_sw_write_enable (<%= write_enable %>),
|
11
|
+
.i_hw_write_enable ('0),
|
12
|
+
.i_hw_write_data ('0),
|
13
|
+
.i_hw_set ('0),
|
14
|
+
.i_hw_clear (<%= clear[loop_variables] %>),
|
15
|
+
.i_value ('0),
|
16
|
+
.i_mask ('1),
|
17
|
+
.o_value (<%= value_out[loop_variables] %>),
|
18
|
+
.o_value_unmasked ()
|
19
|
+
);
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:rs, :w0s, :w1s, :ws, :wos]) do
|
4
|
+
sv_rtl do
|
5
|
+
build do
|
6
|
+
input :clear, {
|
7
|
+
name: "i_#{full_name}_clear", width: width,
|
8
|
+
array_size: array_size, array_format: array_port_format
|
9
|
+
}
|
10
|
+
output :value_out, {
|
11
|
+
name: "o_#{full_name}", width: width,
|
12
|
+
array_size: array_size, array_format: array_port_format
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
main_code :bit_field, from_template: true
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def read_action
|
21
|
+
{
|
22
|
+
rs: 'RGGEN_READ_SET',
|
23
|
+
w0s: 'RGGEN_READ_DEFAULT',
|
24
|
+
w1s: 'RGGEN_READ_DEFAULT',
|
25
|
+
ws: 'RGGEN_READ_DEFAULT',
|
26
|
+
wos: 'RGGEN_READ_NONE'
|
27
|
+
}[bit_field.type]
|
28
|
+
end
|
29
|
+
|
30
|
+
def write_action
|
31
|
+
{
|
32
|
+
rs: 'RGGEN_WRITE_NONE',
|
33
|
+
w0s: 'RGGEN_WRITE_0_SET',
|
34
|
+
w1s: 'RGGEN_WRITE_1_SET',
|
35
|
+
ws: 'RGGEN_WRITE_SET',
|
36
|
+
wos: 'RGGEN_WRITE_SET'
|
37
|
+
}[bit_field.type]
|
38
|
+
end
|
39
|
+
|
40
|
+
def write_enable
|
41
|
+
bit_field.writable? && all_bits_1 || all_bits_0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|