Статическая память в ASIC и FPGA
Введение в проектирование на языке Verilog
Прутьянов В. В.
Память: бистабильный элемент
Бистабильный элемент
4 транзистора
Память: D-защёлка
Бистабильный элемент
4 транзистора
D-защелка
18 транзисторов
Память: D-триггер
Бистабильный элемент
4 транзистора
D-защелка
18 транзисторов
D-триггер
24 транзистора
Память: бистабильный элемент
Бистабильный элемент
4 транзистора
Память: ячейка 6T SRAM
Бистабильный элемент
4 транзистора
6T SRAM ячейка
6 транзисторов
SRAM: массив битовых ячеек
4x2 1RW bitcell array
SRAM: многопортовая битовая ячейка
Источник изображения: https://github.com/VLSIDA/OpenRAM/blob/stable/docs/source/bitcells.md
Многопортовая (1RW1R1W) ячейка SRAM
Skywater 130nm: SP SRAM cell vs. DP SRAM cell vs. D flip-flop
OpenRAM
OpenRAM SKY130 1Kbyte 1RW1R 8bit word
OpenRAM: конфигурация
tech_name = "sky130" # Tech Library
nominal_corner_only = True # TT 1.8V 25°C
word_size = 32 # Bits
num_words = 256
write_size = 32 # Bits
# Dual port
num_rw_ports = 1
num_r_ports = 1
num_w_ports = 0
ports_human = '1rw1r'
check_lvsdrc = True
Источник изображения: M. R. Guthaus et al., "OpenRAM: An Open-Source Memory Compiler," ICCAD, 2016
OpenRAM: datasheet
OpenRAM: временные характеристики
Чтение
Запись
OpenRAM: Verilog модель 1RW1R SRAM (fast functional)
module sky130_sram_1kbyte_1rw1r_32x256_8(
// Port 0: RW
clk0, csb0, web0, addr0, din0, dout0,
// Port 1: R
clk1, csb1, addr1, dout1
); // OpenRAM SRAM model
reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];
reg csb0_reg, csb1_reg, web0_reg;
reg [ADDR_WIDTH-1:0] addr0_reg, addr1_reg;
reg [DATA_WIDTH-1:0] din0_reg;
reg [DATA_WIDTH-1:0] dout0, dout1;
always @(posedge clk0) begin
csb0_reg = csb0;
web0_reg = web0;
addr0_reg = addr0;
din0_reg = din0;
end
always @(posedge clk1) begin
csb1_reg = csb1;
addr1_reg = addr1;
end
// Memory Write Block Port 0
always @ (negedge clk0) begin : MEM_WRITE0
if ( !csb0_reg && !web0_reg )
mem[addr0_reg][31:0] = din0_reg[31:0];
end
// Memory Read Block Port 0
always @ (negedge clk0) begin : MEM_READ0
if (!csb0_reg && web0_reg)
dout0 <= #(DELAY) mem[addr0_reg];
end
// Memory Read Block Port 1
always @ (negedge clk1) begin : MEM_READ1
if (!csb1_reg)
dout1 <= #(DELAY) mem[addr1_reg];
end
Это несинтезируемая функциональная модель!
Verilog: тестбенч
Testbench
Synthesizable Design
IN
OUT
Non-RTL�IP #1
Non-RTL�IP #2
Verilog: функциональные модели
Testbench
Synthesizable Design
Verilog
Functional
Model #1
Verilog
Functional
Model #2
IN
OUT
Ресурсы Altera Cyclone IV E
Ресурсы:
17
Источник: Cyclone IV FPGA Device Family Overview, Cyclone IV Device Handbook, Volume 1, Chapter 1. Table 1-1.
M9K в режиме Single-Port Memory
Cyclone IV M9K: read operation
Источник: Cyclone IV FPGA Device Family Overview, Cyclone IV Device Handbook, Volume 1, Chapter 3. Figure 3-3.
Cyclone IV M9K: write operation
Источник: Cyclone IV FPGA Device Family Overview, Cyclone IV Device Handbook, Volume 1, Chapter 3. Figure 3-4, Figure 3-2.
Cyclone IV M9K: byte enable
Источник: Cyclone IV FPGA Device Family Overview, Cyclone IV Device Handbook, Volume 1, Chapter 3. Figure 3-1.
Пример: вывод содержимого ROM через UART
Quartus: IP Catalog
Quartus: ROM: 1-PORT
Quartus: ROM: 1-PORT
Quartus: ROM: 1-PORT
Memory Initialization File: data.mif
WIDTH=8;
DEPTH=1024;
ADDRESS_RADIX=UNS;
DATA_RADIX=HEX;
CONTENT BEGIN
0 : 3A;
1 : 3A;
2 : 3A;
3 : 3A;
........................
1021 : 3A;
1022 : 0D;
1023 : 0A;
END;
RTL Viewer
ModelSim Intel FPGA 2020.1 в графическом режиме
vlog fpga_top_tb.v fpga_top.v uart_tx.v counter.v altera/rom1r.v
vsim work.tb -L altera_mf_ver
ModelSim Intel FPGA 2020.1 в графическом режиме
vlog fpga_top_tb.v fpga_top.v uart_tx.v counter.v altera/rom1r.v
vsim work.tb -L altera_mf_ver
Quartus: Settings > EDA Tool Settings > Simulation
Quartus: fpga.qsf
# EDA Netlist Writer Assignments
# ==============================
set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation
set_global_assignment -name EDA_OUTPUT_DATA_FORMAT "VERILOG HDL" -section_id eda_simulation
set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation
set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH fpga_top_tb -section_id eda_simulation
set_global_assignment -name EDA_TEST_BENCH_NAME fpga_top_tb -section_id eda_simulation
set_global_assignment -name EDA_TEST_BENCH_DESIGN_INSTANCE_NAME fpga_top -section_id eda_simulation��set_global_assignment -name EDA_DESIGN_INSTANCE_NAME fpga_top -section_id fpga_top_tb
set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME tb -section_id fpga_top_tb
set_global_assignment -name EDA_TEST_BENCH_FILE fpga_top_tb.v -section_id fpga_top_tb
ModelSim Intel FPGA 2020.1 в консольном режиме
vlog fpga_top_tb.v fpga_top.v uart_tx.v counter.v altera/rom1r.v
Model Technology ModelSim - Intel FPGA Edition vlog 2020.1 Compiler 2020.02 Feb 28 2020
Start time: 03:48:54 on Mar 17,2025
vlog fpga_top_tb.v fpga_top.v uart_tx.v counter.v altera/rom1r.v
-- Compiling module tb
-- Compiling module fpga_top
-- Compiling module uart_tx
-- Compiling module counter
-- Compiling module rom1r
Top level modules:
tb
End time: 03:48:55 on Mar 17,2025, Elapsed time: 0:00:01
Errors: 0, Warnings: 0
vsim -c work.tb -L altera_mf_ver -do 'run -all'
Reading pref.tcl
# 2020.1
# vsim -c work.tb -L altera_mf_ver -do "run -all"
# Start time: 03:48:56 on Mar 17,2025
# Loading work.tb
# Loading work.fpga_top
# Loading work.uart_tx
# Loading work.counter
# Loading work.rom1r
# Loading altera_mf_ver.altsyncram
# Loading altera_mf_ver.altsyncram_body
# Loading altera_mf_ver.ALTERA_DEVICE_FAMILIES
# Loading altera_mf_ver.ALTERA_MF_MEMORY_INITIALIZATION
# run -all
# ** Note: $finish : fpga_top_tb.v(27)
# Time: 1 ms Iteration: 0 Instance: /tb
# End time: 03:49:03 on Mar 17,2025, Elapsed time: 0:00:07
# Errors: 0, Warnings: 0
ModelSim Intel FPGA 2020.1 в консольном режиме
vlog fpga_top_tb.v fpga_top.v uart_tx.v counter.v altera/rom1r.v
Model Technology ModelSim - Intel FPGA Edition vlog 2020.1 Compiler 2020.02 Feb 28 2020
Start time: 03:48:54 on Mar 17,2025
vlog fpga_top_tb.v fpga_top.v uart_tx.v counter.v altera/rom1r.v
-- Compiling module tb
-- Compiling module fpga_top
-- Compiling module uart_tx
-- Compiling module counter
-- Compiling module rom1r
Top level modules:
tb
End time: 03:48:55 on Mar 17,2025, Elapsed time: 0:00:01
Errors: 0, Warnings: 0
vsim -c work.tb -L altera_mf_ver -do 'run -all'
Reading pref.tcl
# 2020.1
# vsim -c work.tb -L altera_mf_ver -do "run -all"
# Start time: 03:48:56 on Mar 17,2025
# Loading work.tb
# Loading work.fpga_top
# Loading work.uart_tx
# Loading work.counter
# Loading work.rom1r
# Loading altera_mf_ver.altsyncram
# Loading altera_mf_ver.altsyncram_body
# Loading altera_mf_ver.ALTERA_DEVICE_FAMILIES
# Loading altera_mf_ver.ALTERA_MF_MEMORY_INITIALIZATION
# run -all
# ** Note: $finish : fpga_top_tb.v(27)
# Time: 1 ms Iteration: 0 Instance: /tb
# End time: 03:49:03 on Mar 17,2025, Elapsed time: 0:00:07
# Errors: 0, Warnings: 0
Функциональные модели M9K
Функциональная модель для Icarus Verilog
module rom1r_wrap(
input wire clock,
input wire [9:0] address,
output wire [7:0] q
);
`ifdef __ICARUS__
reg [7:0] mem [0:1023];
reg [9:0] addr_d;
initial $readmemh("data.txt", mem);
always @(posedge clock)
addr_d <= address;
assign q = mem[addr_d];
`else // Quartus/ModelSim
rom1r u_rom (
.address (address),
.clock (clock ),
.q (q )
);
`endif
endmodule
ModelSim (altera_mf_ver)
Icarus Verilog (rom1_wrap)
In-System Memory Content Editor
In-System Memory
Content Editor
Quartus: Tools > In-System Memory Content Editor
$ sudo picocom -b 2000000 /dev/ttyUSB0
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::.. ..---.: . :-:: :: :--: :::::. .:::::::
::=%@@@@%%%@@@@:@@@@@@%#@@@+ @@@@%%@@@@@ ::::. .@@= :::::::
::. @* %# @% @@* .@@% +@@ :::: -@@@@ ::::::
::: @+ @- @@ @@# @@= :::: =@ :::. @@ %@+ :::::
::: @@@@@@- :.: @@ .-@@@: .@@ ::: :. +: #@= .::::
::: @* :@- ::: @@#@@%- :@@ :::=@@@@@*. -@@@%@@@@- ::::
::: @# : .::: @@ .::. @@% .:: +@@ .=@:.: @@@ .::
:. @* .:::: @% .::::: -@@ @@@ @# :@= .:
:.@@@@@@@@.::::@@@@@@@@.:::::: -@@@@@@ :@ @@@@@@-:.@@@@@@@.:
:. .:::: .::::::::. .:. .:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
$ sudo picocom -b 2000000 /dev/ttyUSB0
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::.. ..---.: . :-:: :: :--: :::::. .:::::::
::=%@@@@%%%@@@@:@@@@@@%#@@@+ @@@@%%@@@@@ ::::. .@@= :::::::
::. @* %# @% @@* .@@% +@@ :::: -@@@@ ::::::
::: @+ @- @@ @@# @@= :::: =@ :::. @@ %@+ :::::
::: @@@@@@- :.: @@ .-@@@: .@@ ::: :. +: #@= .::::
::: @* :@- ::: @@#@@%- :@@ :::=@@@@@*. -@@@%@@@@- ::::
::: @# : .::: @@ .::. @@% .:: +@@ .=@:.: @@@ .::
:. @* .:::: @% .::::: -@@ @@@ @# :@= .:
:.@@@@@@@@.::::@@@@@@@@.:::::: -@@@@@@ :@ @@@@@@-:.@@@@@@@.:
:. .:::: .::::::::. .:. .:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
In-System Memory Content Editor читает и изменяет содержимое М9К блоков непосредственно во время работы схемы через порт B
Quartus: Tools > In-System Memory Content Editor
$ sudo picocom -b 2000000 /dev/ttyUSB0
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::.. ..---.: . :-:: :: :--: :::::. .:::::::
::=%@@@@%%%@@@@:@@@@@@%#@@@+ @@@@%%@@@@@ ::::. .@@= :::::::
::. @* %# @% @@* .@@% +@@ :::: -@@@@ ::::::
::: @+ @- @@ @@# @@= :::: =@ :::. @@ %@+ :::::
::: @@@@@@- :.: @@ .-@@@: .@@ ::: :. +: #@= .::::
33333333333333333333333333333333333333333333333333333333333333
::: @# : .::: @@ .::. @@% .:: +@@ .=@:.: @@@ .::
:. @* .:::: @% .::::: -@@ @@@ @# :@= .:
:.@@@@@@@@.::::@@@@@@@@.:::::: -@@@@@@ :@ @@@@@@-:.@@@@@@@.:
:. .:::: .::::::::. .:. .:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
In-System Memory Content Editor читает и изменяет содержимое М9К блоков непосредственно во время работы схемы через порт B
Quartus: Tools > Signal Tap Logic Analyzer
SignalTap Logic Analyzer записывает и отображает выбранные сигналы во время работы схемы
Однотактная микроархитектура
Однотактная микроархитектура: IMEM
Однотактная микроархитектура: IMEM
Однотактная микроархитектура: IMEM
Однотактная микроархитектура: LSU
Многотактная микроархитектура: LSU
Многотактная микроархитектура
Многотактная микроархитектура: симуляция
LOAD
LOAD
LOAD
Инструкции
Reports
+-------------------------------------------------------------------------------------+
; Flow Summary ;
+------------------------------------+------------------------------------------------+
; Quartus Prime Version ; 23.1std.1 Build 993 05/14/2024 SC Lite Edition ;
; Top-level Entity Name ; fpga_top ;
; Family ; Cyclone IV E ;
; Device ; EP4CE15F23C8 ;
; Timing Models ; Final ;
; Total logic elements ; 2,835 / 15,408 ( 18 % ) ;
; Total combinational functions ; 2,638 / 15,408 ( 17 % ) ;
; Dedicated logic registers ; 1,115 / 15,408 ( 7 % ) ;
; Total registers ; 1115 ;
; Total pins ; 6 / 344 ( 2 % ) ;
; Total virtual pins ; 0 ;
; Total memory bits ; 16,384 / 516,096 ( 3 % ) ;
; Embedded Multiplier 9-bit elements ; 0 / 112 ( 0 % ) ;
; Total PLLs ; 0 / 4 ( 0 % ) ;
+------------------------------------+------------------------------------------------+
+-------------------------------------------------+
; Slow 1200mV 0C Model Fmax Summary ;
+-----------+-----------------+------------+------+
; Fmax ; Restricted Fmax ; Clock Name ; Note ;
+-----------+-----------------+------------+------+
; 47.17 MHz ; 47.17 MHz ; CLK ; ;
+-----------+-----------------+------------+------+
Chip Planner
Задание
Литература