rggen 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/c_header/LICENSE +21 -0
- data/{c → c_header}/rggen.h +0 -0
- data/lib/rggen/builtins.rb +2 -5
- data/lib/rggen/builtins/bit_field/type.rb +22 -7
- data/lib/rggen/builtins/bit_field/types/ro.erb +2 -2
- data/lib/rggen/builtins/bit_field/types/ro.rb +2 -2
- data/lib/rggen/builtins/bit_field/types/rw.erb +5 -9
- data/lib/rggen/builtins/bit_field/types/rw.rb +5 -5
- data/lib/rggen/builtins/bit_field/types/rwl_rwe.erb +3 -7
- data/lib/rggen/builtins/bit_field/types/rwl_rwe.rb +6 -7
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.erb +8 -12
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.rb +5 -2
- data/lib/rggen/builtins/bit_field/types/w0s_w1s.erb +8 -12
- data/lib/rggen/builtins/bit_field/types/w0s_w1s.rb +3 -6
- data/lib/rggen/builtins/register/array.rb +0 -93
- data/lib/rggen/builtins/register/reg_model.rb +1 -1
- data/lib/rggen/builtins/register/rtl_top.rb +68 -0
- data/lib/rggen/builtins/register/type.rb +74 -0
- data/lib/rggen/builtins/register/types/default.erb +10 -0
- data/lib/rggen/builtins/register/types/external.erb +11 -0
- data/lib/rggen/builtins/register/types/external.rb +11 -0
- data/lib/rggen/builtins/register/types/indirect.erb +13 -0
- data/lib/rggen/builtins/register/types/indirect.rb +43 -0
- data/lib/rggen/builtins/register_block/clock_reset.rb +2 -2
- data/lib/rggen/builtins/register_block/host_if.rb +11 -12
- data/lib/rggen/builtins/register_block/host_ifs/apb.erb +7 -25
- data/lib/rggen/builtins/register_block/host_ifs/apb.rb +4 -13
- data/lib/rggen/builtins/register_block/host_ifs/axi4lite.erb +6 -34
- data/lib/rggen/builtins/register_block/host_ifs/axi4lite.rb +8 -30
- data/lib/rggen/builtins/register_block/irq_controller.rb +4 -4
- data/lib/rggen/builtins/register_block/rtl_top.erb +7 -0
- data/lib/rggen/builtins/register_block/rtl_top.rb +28 -0
- data/lib/rggen/core_components.rb +3 -0
- data/lib/rggen/core_components/ral/item.rb +2 -6
- data/lib/rggen/core_components/rtl/component.rb +8 -8
- data/lib/rggen/core_components/rtl/item.rb +41 -38
- data/lib/rggen/core_components/verilog_utility.rb +23 -4
- data/lib/rggen/core_components/verilog_utility/declaration.rb +14 -4
- data/lib/rggen/core_components/verilog_utility/identifier.rb +19 -0
- data/lib/rggen/core_components/verilog_utility/interface_instantiation.rb +33 -0
- data/lib/rggen/core_components/verilog_utility/interface_port_declaration.rb +29 -0
- data/lib/rggen/core_components/verilog_utility/local_scope.rb +64 -0
- data/lib/rggen/core_extensions/facets.rb +1 -1
- data/lib/rggen/core_extensions/forwardable.rb +1 -1
- data/lib/rggen/version.rb +2 -2
- data/ral/LICENSE +21 -0
- data/ral/rggen_ral_macros.svh +1 -4
- data/ral/rggen_ral_reg.svh +35 -3
- data/rtl/LICENSE +21 -0
- data/rtl/compile.f +21 -6
- data/rtl/rggen_address_decoder.sv +23 -0
- data/rtl/rggen_apb_if.sv +41 -0
- data/rtl/rggen_axi4lite_if.sv +68 -0
- data/rtl/rggen_bit_field_if.sv +28 -0
- data/rtl/rggen_bit_field_ro.sv +9 -0
- data/rtl/rggen_bit_field_rw.sv +25 -0
- data/rtl/rggen_bit_field_rwl_rwe.sv +29 -0
- data/rtl/rggen_bit_field_w01s_w01c.sv +55 -0
- data/rtl/rggen_bus_if.sv +43 -0
- data/rtl/rggen_bus_splitter.sv +87 -0
- data/rtl/rggen_default_register.sv +15 -0
- data/rtl/rggen_external_register.sv +83 -0
- data/rtl/rggen_host_if_apb.sv +29 -0
- data/rtl/rggen_host_if_axi4lite.sv +14 -0
- data/rtl/rggen_indirect_register.sv +21 -0
- data/rtl/{register_block/rggen_irq_controller.sv → rggen_irq_controller.sv} +0 -0
- data/rtl/rggen_register_base.sv +57 -0
- data/rtl/rggen_register_if.sv +42 -0
- data/rtl/rggen_rtl_pkg.sv +23 -0
- data/sample/LICENSE +21 -0
- data/sample/sample_0.sv +315 -444
- data/sample/sample_0_ral_pkg.sv +7 -7
- data/sample/sample_1.sv +104 -162
- data/sample/sample_1_ral_pkg.sv +3 -3
- data/sample/sample_setup.rb +2 -2
- data/setup/default.rb +3 -3
- metadata +35 -23
- data/lib/rggen/builtins/register/address_decoder.erb +0 -12
- data/lib/rggen/builtins/register/address_decoder.rb +0 -82
- data/lib/rggen/builtins/register/bus_exporter.erb +0 -28
- data/lib/rggen/builtins/register/bus_exporter.rb +0 -52
- data/lib/rggen/builtins/register/read_data.rb +0 -61
- data/lib/rggen/builtins/register_block/response_mux.erb +0 -18
- data/lib/rggen/builtins/register_block/response_mux.rb +0 -47
- data/lib/rggen/builtins/register_block/top_module.rb +0 -20
- data/rtl/bit_field/rggen_bit_field_common.svh +0 -15
- data/rtl/bit_field/rggen_bit_field_ro.sv +0 -8
- data/rtl/bit_field/rggen_bit_field_rw.sv +0 -27
- data/rtl/bit_field/rggen_bit_field_rwl_rwe.sv +0 -49
- data/rtl/bit_field/rggen_bit_field_w01s_w01c.sv +0 -67
- data/rtl/register/rggen_address_decoder.sv +0 -37
- data/rtl/register/rggen_bus_exporter.sv +0 -96
- data/rtl/register_block/rggen_host_if_apb.sv +0 -42
- data/rtl/register_block/rggen_host_if_axi4lite.sv +0 -257
- data/rtl/register_block/rggen_host_if_common.svh +0 -9
- data/rtl/register_block/rggen_response_mux.sv +0 -113
@@ -1,12 +0,0 @@
|
|
1
|
-
rggen_address_decoder #(
|
2
|
-
.ADDRESS_WIDTH (<%= local_address_width - address_lsb %>),
|
3
|
-
.START_ADDRESS (<%= start_address%>),
|
4
|
-
.END_ADDRESS (<%= end_address %>),
|
5
|
-
.INDIRECT_REGISTER (<%= indirect_register %>),
|
6
|
-
.INDIRECT_INDEX_WIDTH (<%= indirect_index_width %>),
|
7
|
-
.INDIRECT_INDEX_VALUE (<%= indirect_index_value %>)
|
8
|
-
) u_<%= register.name%>_address_decoder (
|
9
|
-
.i_address (<%= register_block.host_if.address[local_address_width - 1, address_lsb] %>),
|
10
|
-
.i_indirect_index (<%= (type?(:indirect) && indirect_index[loop_variables]) || indirect_index_value %>),
|
11
|
-
.o_select (<%= register_block.register_select[register.index] %>)
|
12
|
-
);
|
@@ -1,82 +0,0 @@
|
|
1
|
-
simple_item :register, :address_decoder do
|
2
|
-
rtl do
|
3
|
-
build do
|
4
|
-
next unless type?(:indirect)
|
5
|
-
logic :indirect_index,
|
6
|
-
name: "#{register.name}_indirect_index",
|
7
|
-
width: indirect_index_width,
|
8
|
-
dimensions: register.dimensions
|
9
|
-
end
|
10
|
-
|
11
|
-
generate_code :module_item do |buffer|
|
12
|
-
buffer << indirect_index_assignment << nl if type?(:indirect)
|
13
|
-
buffer << process_template
|
14
|
-
end
|
15
|
-
|
16
|
-
delegate [:local_address_width] => :register_block
|
17
|
-
delegate [:array?, :type?, :multiple?] => :register
|
18
|
-
delegate [:indexes, :loop_variables] => :register
|
19
|
-
|
20
|
-
def address_lsb
|
21
|
-
Math.clog2(configuration.byte_width)
|
22
|
-
end
|
23
|
-
|
24
|
-
def start_address
|
25
|
-
address_code(register.start_address)
|
26
|
-
end
|
27
|
-
|
28
|
-
def end_address
|
29
|
-
if array?
|
30
|
-
address = register.start_address + configuration.byte_width - 1
|
31
|
-
address_code(address)
|
32
|
-
else
|
33
|
-
address_code(register.end_address)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def address_code(address)
|
38
|
-
shift = address_lsb
|
39
|
-
base = hex(address >> shift, local_address_width - shift)
|
40
|
-
(array? && multiple? && "#{base} + #{register.local_index}") || base
|
41
|
-
end
|
42
|
-
|
43
|
-
def indirect_index_assignment
|
44
|
-
assign(
|
45
|
-
indirect_index[register.loop_variables],
|
46
|
-
concat(indirect_index_fields.map(&:value))
|
47
|
-
)
|
48
|
-
end
|
49
|
-
|
50
|
-
def indirect_register
|
51
|
-
(type?(:indirect) && 1) || 0
|
52
|
-
end
|
53
|
-
|
54
|
-
def indirect_index_width
|
55
|
-
return 1 unless type?(:indirect)
|
56
|
-
indirect_index_fields.sum(0, &:width)
|
57
|
-
end
|
58
|
-
|
59
|
-
def indirect_index_value
|
60
|
-
return hex(0, 1) unless type?(:indirect)
|
61
|
-
concat(indirect_index_values)
|
62
|
-
end
|
63
|
-
|
64
|
-
def indirect_index_fields
|
65
|
-
@indirect_index_fields ||= indexes.map do |index|
|
66
|
-
register_block.bit_fields.find_by(name: index.name)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def indirect_index_values
|
71
|
-
variables = loop_variables
|
72
|
-
indexes.map.with_index do |index, i|
|
73
|
-
if index.value
|
74
|
-
hex(index.value, indirect_index_fields[i].width)
|
75
|
-
else
|
76
|
-
loop_variable = variables.shift
|
77
|
-
loop_variable[indirect_index_fields[i].width - 1, 0]
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
rggen_bus_exporter #(
|
2
|
-
.DATA_WIDTH (<%= configuration.data_width %>),
|
3
|
-
.LOCAL_ADDRESS_WIDTH (<%= register_block.local_address_width %>),
|
4
|
-
.EXTERNAL_ADDRESS_WIDTH (<%= address_width %>),
|
5
|
-
.START_ADDRESS (<%= start_address %>)
|
6
|
-
) u_<%= name %>_bus_exporter (
|
7
|
-
.clk (<%= register_block.clock %>),
|
8
|
-
.rst_n (<%= register_block.reset %>),
|
9
|
-
.i_valid (<%= register_block.host_if.command_valid %>),
|
10
|
-
.i_select (<%= register_block.register_select[index] %>),
|
11
|
-
.i_write (<%= register_block.host_if.write %>),
|
12
|
-
.i_read (<%= register_block.host_if.read %>),
|
13
|
-
.i_address (<%= register_block.host_if.address %>),
|
14
|
-
.i_strobe (<%= register_block.host_if.strobe %>),
|
15
|
-
.i_write_data (<%= register_block.host_if.write_data %>),
|
16
|
-
.o_ready (<%= register_block.external_register_ready[external_index] %>),
|
17
|
-
.o_read_data (<%= register_block.register_read_data[index] %>),
|
18
|
-
.o_status (<%= register_block.external_register_status[external_index] %>),
|
19
|
-
.o_valid (<%= valid %>),
|
20
|
-
.o_write (<%= write %>),
|
21
|
-
.o_read (<%= read %>),
|
22
|
-
.o_address (<%= address %>),
|
23
|
-
.o_strobe (<%= strobe %>),
|
24
|
-
.o_write_data (<%= write_data %>),
|
25
|
-
.i_ready (<%= ready %>),
|
26
|
-
.i_read_data (<%= read_data %>),
|
27
|
-
.i_status (<%= status %>)
|
28
|
-
);
|
@@ -1,52 +0,0 @@
|
|
1
|
-
simple_item :register, :bus_exporter do
|
2
|
-
rtl do
|
3
|
-
delegate [
|
4
|
-
:data_width, :byte_width
|
5
|
-
] => :configuration
|
6
|
-
delegate [
|
7
|
-
:name, :byte_size, :index, :external_index
|
8
|
-
] => :register
|
9
|
-
|
10
|
-
available? { register.type?(:external) }
|
11
|
-
|
12
|
-
build do
|
13
|
-
output :valid , name: "o_#{name}_valid" , width: 1
|
14
|
-
output :write , name: "o_#{name}_write" , width: 1
|
15
|
-
output :read , name: "o_#{name}_read" , width: 1
|
16
|
-
output :address , name: "o_#{name}_address" , width: address_width
|
17
|
-
output :strobe , name: "o_#{name}_strobe" , width: byte_width
|
18
|
-
output :write_data, name: "o_#{name}_write_data", width: data_width
|
19
|
-
input :ready , name: "i_#{name}_ready" , width: 1
|
20
|
-
input :status , name: "i_#{name}_status" , width: 2
|
21
|
-
input :read_data , name: "i_#{name}_read_data" , width: data_width
|
22
|
-
end
|
23
|
-
|
24
|
-
generate_code :module_item do |code|
|
25
|
-
code << register_select_connection << nl
|
26
|
-
code << process_template
|
27
|
-
end
|
28
|
-
|
29
|
-
def address_width
|
30
|
-
Math.clog2(byte_size)
|
31
|
-
end
|
32
|
-
|
33
|
-
def register_select_connection
|
34
|
-
assign(
|
35
|
-
register_block.external_register_select[external_index],
|
36
|
-
register_block.register_select[index]
|
37
|
-
)
|
38
|
-
end
|
39
|
-
|
40
|
-
def start_address
|
41
|
-
hex(register.start_address, register_block.local_address_width)
|
42
|
-
end
|
43
|
-
|
44
|
-
def external_index
|
45
|
-
external_registers.index(®ister.method(:equal?))
|
46
|
-
end
|
47
|
-
|
48
|
-
def external_registers
|
49
|
-
register_block.registers.select { |r| r.type?(:external) }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
simple_item :register, :read_data do
|
2
|
-
rtl do
|
3
|
-
available? { !register.type?(:external) }
|
4
|
-
|
5
|
-
generate_code :module_item do |buffer|
|
6
|
-
buffer << assign(register_read_data, read_data) << nl
|
7
|
-
end
|
8
|
-
|
9
|
-
define_struct :read_data_entry, [:lsb, :msb, :value, :dummy] do
|
10
|
-
def initialize(args)
|
11
|
-
self.lsb = args[:lsb]
|
12
|
-
self.msb = args[:msb]
|
13
|
-
self.value = args[:value]
|
14
|
-
self.dummy = args[:dummy] || false
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
delegate [:data_width] => :configuration
|
19
|
-
delegate [:loop_variables] => :register
|
20
|
-
|
21
|
-
def register_read_data
|
22
|
-
register_block.register_read_data[register.index]
|
23
|
-
end
|
24
|
-
|
25
|
-
def read_data
|
26
|
-
if register.readable?
|
27
|
-
concat(read_data_expressions)
|
28
|
-
else
|
29
|
-
hex(0, configuration.data_width)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def read_data_expressions
|
34
|
-
read_data_entries.each_cons(2).with_object([]) do |entries, expressions|
|
35
|
-
padding_bits = entries[0].lsb - entries[1].msb - 1
|
36
|
-
expressions << hex(0, padding_bits) if padding_bits > 0
|
37
|
-
expressions << entries[1].value unless entries[1].dummy
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def read_data_entries
|
42
|
-
[].tap do |entries|
|
43
|
-
entries << read_data_entry.new(lsb: data_width, dummy: true)
|
44
|
-
entries.concat(readable_field_entries)
|
45
|
-
entries << read_data_entry.new(msb: -1, dummy: true)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def readable_field_entries
|
50
|
-
readable_fields.map do |field|
|
51
|
-
read_data_entry.new(
|
52
|
-
lsb: field.lsb, msb: field.msb, value: field.value[loop_variables]
|
53
|
-
)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def readable_fields
|
58
|
-
register.bit_fields.select(&:readable?).sort_by(&:msb).reverse
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
rggen_response_mux #(
|
2
|
-
.DATA_WIDTH (<%= configuration.data_width %>),
|
3
|
-
.TOTAL_REGISTERS (<%= total_registers %>),
|
4
|
-
.TOTAL_EXTERNAL_REGISTERS (<%= total_external_registers %>)
|
5
|
-
) u_response_mux (
|
6
|
-
.clk (<%= register_block.clock %>),
|
7
|
-
.rst_n (<%= register_block.reset %>),
|
8
|
-
.i_command_valid (<%= register_block.host_if.command_valid %>),
|
9
|
-
.i_read (<%= register_block.host_if.read %>),
|
10
|
-
.o_response_ready (<%= register_block.host_if.response_ready %>),
|
11
|
-
.o_read_data (<%= register_block.host_if.read_data %>),
|
12
|
-
.o_status (<%= register_block.host_if.status %>),
|
13
|
-
.i_register_select (<%= register_select %>),
|
14
|
-
.i_register_read_data (<%= register_read_data %>),
|
15
|
-
.i_external_register_select (<%= actual_external_register_select %>),
|
16
|
-
.i_external_register_ready (<%= actual_external_register_ready %>),
|
17
|
-
.i_external_register_status (<%= actual_external_register_status %>)
|
18
|
-
);
|
@@ -1,47 +0,0 @@
|
|
1
|
-
simple_item :register_block, :response_mux do
|
2
|
-
rtl do
|
3
|
-
build do
|
4
|
-
logic :register_select , width: total_registers
|
5
|
-
logic :register_read_data,
|
6
|
-
width: configuration.data_width,
|
7
|
-
dimensions: [total_registers]
|
8
|
-
if external_registers?
|
9
|
-
logic :external_register_select,
|
10
|
-
width: total_external_registers,
|
11
|
-
vector: true
|
12
|
-
logic :external_register_ready ,
|
13
|
-
width: total_external_registers,
|
14
|
-
vector: true
|
15
|
-
logic :external_register_status,
|
16
|
-
width: 2,
|
17
|
-
dimensions: [total_external_registers]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
generate_code_from_template :module_item
|
22
|
-
|
23
|
-
def total_registers
|
24
|
-
register_block.registers.sum(0, &:count)
|
25
|
-
end
|
26
|
-
|
27
|
-
def external_registers?
|
28
|
-
register_block.registers.any? { |r| r.type?(:external) }
|
29
|
-
end
|
30
|
-
|
31
|
-
def total_external_registers
|
32
|
-
register_block.registers.count { |r| r.type?(:external) }
|
33
|
-
end
|
34
|
-
|
35
|
-
def actual_external_register_select
|
36
|
-
(external_registers? && external_register_select) || bin(0, 1)
|
37
|
-
end
|
38
|
-
|
39
|
-
def actual_external_register_ready
|
40
|
-
(external_registers? && external_register_ready) || bin(0, 1)
|
41
|
-
end
|
42
|
-
|
43
|
-
def actual_external_register_status
|
44
|
-
(external_registers? && external_register_status) || array(bin(0, 2))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
define_simple_item :register_block, :top_module do
|
2
|
-
rtl do
|
3
|
-
write_file '<%= register_block.name %>.sv' do |f|
|
4
|
-
f.body { source_file_body }
|
5
|
-
end
|
6
|
-
|
7
|
-
def source_file_body
|
8
|
-
module_definition register_block.name do |m|
|
9
|
-
m.parameters register_block.parameter_declarations
|
10
|
-
m.ports register_block.port_declarations
|
11
|
-
m.signals register_block.signal_declarations
|
12
|
-
m.body { |code| module_body(code) }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def module_body(code)
|
17
|
-
register_block.generate_code(:module_item, :top_down, code)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
function automatic logic is_write_access(
|
2
|
-
input command_valid,
|
3
|
-
input select,
|
4
|
-
input write
|
5
|
-
);
|
6
|
-
return (command_valid && select && write) ? 1'b1 : 1'b0;
|
7
|
-
endfunction
|
8
|
-
|
9
|
-
function automatic logic [WIDTH-1:0] get_write_data(
|
10
|
-
input [WIDTH-1:0] current_data,
|
11
|
-
input [WIDTH-1:0] write_data,
|
12
|
-
input [WIDTH-1:0] write_mask
|
13
|
-
);
|
14
|
-
return (current_data & (~write_mask)) | (write_data & write_mask);
|
15
|
-
endfunction
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module rggen_bit_field_rw #(
|
2
|
-
parameter WIDTH = 1,
|
3
|
-
parameter INITIAL_VALUE = 0
|
4
|
-
)(
|
5
|
-
input clk,
|
6
|
-
input rst_n,
|
7
|
-
input i_command_valid,
|
8
|
-
input i_select,
|
9
|
-
input i_write,
|
10
|
-
input [WIDTH-1:0] i_write_data,
|
11
|
-
input [WIDTH-1:0] i_write_mask,
|
12
|
-
output [WIDTH-1:0] o_value
|
13
|
-
);
|
14
|
-
`include "rggen_bit_field_common.svh"
|
15
|
-
|
16
|
-
logic [WIDTH-1:0] value;
|
17
|
-
|
18
|
-
assign o_value = value;
|
19
|
-
always_ff @(posedge clk or negedge rst_n) begin
|
20
|
-
if (!rst_n) begin
|
21
|
-
value <= INITIAL_VALUE;
|
22
|
-
end
|
23
|
-
else if (is_write_access(i_command_valid, i_select, i_write)) begin
|
24
|
-
value <= get_write_data(value, i_write_data, i_write_mask);
|
25
|
-
end
|
26
|
-
end
|
27
|
-
endmodule
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module rggen_bit_field_rwl_rwe #(
|
2
|
-
parameter LOCK_MODE = 1,
|
3
|
-
parameter WIDTH = 1,
|
4
|
-
parameter INITIAL_VALUE = 0
|
5
|
-
)(
|
6
|
-
input clk,
|
7
|
-
input rst_n,
|
8
|
-
input i_lock_or_enable,
|
9
|
-
input i_command_valid,
|
10
|
-
input i_select,
|
11
|
-
input i_write,
|
12
|
-
input [WIDTH-1:0] i_write_data,
|
13
|
-
input [WIDTH-1:0] i_write_mask,
|
14
|
-
output [WIDTH-1:0] o_value
|
15
|
-
);
|
16
|
-
`include "rggen_bit_field_common.svh"
|
17
|
-
|
18
|
-
logic [WIDTH-1:0] value;
|
19
|
-
|
20
|
-
assign o_value = value;
|
21
|
-
always_ff @(posedge clk or negedge rst_n) begin
|
22
|
-
if (!rst_n) begin
|
23
|
-
value <= INITIAL_VALUE;
|
24
|
-
end
|
25
|
-
else if (
|
26
|
-
can_write(i_lock_or_enable, i_command_valid, i_select, i_write)
|
27
|
-
) begin
|
28
|
-
value <= get_write_data(value, i_write_data, i_write_mask);
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
function automatic logic can_write(
|
33
|
-
input lock_or_enable,
|
34
|
-
input command_valid,
|
35
|
-
input select,
|
36
|
-
input write
|
37
|
-
);
|
38
|
-
if (LOCK_MODE) begin
|
39
|
-
return (
|
40
|
-
(!lock_or_enable) && is_write_access(command_valid, select, write)
|
41
|
-
) ? 1'b1 : 1'b0;
|
42
|
-
end
|
43
|
-
else begin
|
44
|
-
return (
|
45
|
-
lock_or_enable && is_write_access(command_valid, select, write)
|
46
|
-
) ? 1'b1 : 1'b0;
|
47
|
-
end
|
48
|
-
endfunction
|
49
|
-
endmodule
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module rggen_bit_field_w01s_w01c #(
|
2
|
-
parameter WIDTH = 1,
|
3
|
-
parameter INITIAL_VALUE = 0,
|
4
|
-
parameter SET_MODE = 1,
|
5
|
-
parameter SET_CLEAR_VALUE = 0
|
6
|
-
)(
|
7
|
-
input clk,
|
8
|
-
input rst_n,
|
9
|
-
input [WIDTH-1:0] i_set_or_clear,
|
10
|
-
input i_command_valid,
|
11
|
-
input i_select,
|
12
|
-
input i_write,
|
13
|
-
input [WIDTH-1:0] i_write_data,
|
14
|
-
input [WIDTH-1:0] i_write_mask,
|
15
|
-
output [WIDTH-1:0] o_value
|
16
|
-
);
|
17
|
-
`include "rggen_bit_field_common.svh"
|
18
|
-
|
19
|
-
logic [WIDTH-1:0] value;
|
20
|
-
|
21
|
-
assign o_value = value;
|
22
|
-
always_ff @(posedge clk or negedge rst_n) begin
|
23
|
-
if (!rst_n) begin
|
24
|
-
value <= INITIAL_VALUE;
|
25
|
-
end
|
26
|
-
else begin
|
27
|
-
value <= get_next_value(
|
28
|
-
i_set_or_clear,
|
29
|
-
value,
|
30
|
-
i_command_valid,
|
31
|
-
i_select,
|
32
|
-
i_write,
|
33
|
-
i_write_mask,
|
34
|
-
i_write_data
|
35
|
-
);
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
function automatic logic [WIDTH-1:0] get_next_value(
|
40
|
-
input [WIDTH-1:0] set_or_clear,
|
41
|
-
input [WIDTH-1:0] current_value,
|
42
|
-
input command_valid,
|
43
|
-
input select,
|
44
|
-
input write,
|
45
|
-
input [WIDTH-1:0] write_mask,
|
46
|
-
input [WIDTH-1:0] write_data
|
47
|
-
);
|
48
|
-
logic [WIDTH-1:0] control_value;
|
49
|
-
logic [WIDTH-1:0] set;
|
50
|
-
logic [WIDTH-1:0] clear;
|
51
|
-
if (is_write_access(command_valid, select, write)) begin
|
52
|
-
control_value = write_mask & ((SET_CLEAR_VALUE) ? write_data : ~write_data);
|
53
|
-
end
|
54
|
-
else begin
|
55
|
-
control_value = '0;
|
56
|
-
end
|
57
|
-
if (SET_MODE) begin
|
58
|
-
set = control_value;
|
59
|
-
clear = set_or_clear;
|
60
|
-
end
|
61
|
-
else begin
|
62
|
-
set = set_or_clear;
|
63
|
-
clear = control_value;
|
64
|
-
end
|
65
|
-
return set | (current_value & (~clear));
|
66
|
-
endfunction
|
67
|
-
endmodule
|