✨ feat: added support for markdown pages
This commit is contained in:
64
app/page.tsx
64
app/page.tsx
@@ -1,50 +1,20 @@
|
|||||||
|
import { getSortedPostsData } from '@/lib/posts';
|
||||||
import BlogArea from "../components/blogpost";
|
import BlogArea from '@/components/blogpost';
|
||||||
|
|
||||||
|
|
||||||
// Mock data for blog posts
|
|
||||||
const blogposts = [
|
|
||||||
{
|
|
||||||
label: "Оптимизация конвейера: как мы добились IPC 1.2 в нашем RISC-V ядре",
|
|
||||||
body: "Разбираем как с помощью глубокого конвейера и точного предсказания переходов ускорили выполнение инструкций. Бенчмарки показывают прирост в 3.7x compared to naive implementation.",
|
|
||||||
publish: "5 августа 2023",
|
|
||||||
get_absolute_url: "/post/optimizatsiya-konveyera-risc-v",
|
|
||||||
tags: ["risc-v", "microarchitecture", "optimization"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "RISC-V Custom Extensions: почему мы добавили свои инструкции в процессор",
|
|
||||||
body: "После 6 месяцев анализа мы расширили базовый набор команд. В статье делимся болью верификации, разработкой компиляторной поддержки и тем, как это ускорило обработку AES в 17 раз.",
|
|
||||||
publish: "12 августа 2023",
|
|
||||||
get_absolute_url: "/risc-v-custom-extensions",
|
|
||||||
tags: ["risc-v", "isa", "hardware"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Кастомный memory-mapped периферийный контроллер для RISC-V SoC",
|
|
||||||
body: "Как мы реализовали низколатентный доступ к периферии. Разбираем взаимодействие с шиной TileLink, arbitration и особенности работы с прерываниями.",
|
|
||||||
publish: "19 августа 2023",
|
|
||||||
get_absolute_url: "/memory-mapped-controller-risc-v-soc",
|
|
||||||
tags: ["risc-v", "soc", "embedded"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Hot-swap модулей в RISC-V системе: динамическая подгрузка ускорителей",
|
|
||||||
body: "Реализовали runtime-конфигурацию процессорных расширений на ПЛИС. Теперь можно подгружать крипто-ускорители и DSP блоки без перезагрузки всей системы.",
|
|
||||||
publish: "26 августа 2023",
|
|
||||||
get_absolute_url: "/hot-swap-risc-v-modules",
|
|
||||||
tags: ["risc-v", "fpga", "dynamic"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Верификация RISC-V ядра: как мы покрыли 99.8% кода формальной проверкой",
|
|
||||||
body: "Наша методология верификации с использованием UVM и SymbiYosys. Показываем как обнаружили 47 критических багов до tape-out и добились соответствия спецификации.",
|
|
||||||
publish: "2 сентября 2023",
|
|
||||||
get_absolute_url: "/verifikatsiya-risc-v-yadra",
|
|
||||||
tags: ["risc-v", "verification", "formal"]
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
const blogposts = getSortedPostsData();
|
||||||
<main>
|
|
||||||
<BlogArea blogposts={blogposts} />
|
const formattedPosts = blogposts.map(post => ({
|
||||||
</main>
|
label: post.title,
|
||||||
);
|
body: post.description,
|
||||||
|
publish: new Date(post.date).toLocaleDateString('ru-RU', {
|
||||||
|
day: 'numeric',
|
||||||
|
month: 'long',
|
||||||
|
year: 'numeric',
|
||||||
|
}),
|
||||||
|
get_absolute_url: `/post/${post.slug}`,
|
||||||
|
tags: post.tags,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return <BlogArea blogposts={formattedPosts} />;
|
||||||
}
|
}
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import Link from "next/link";
|
|
||||||
|
|
||||||
export default function Post() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<main className="flex flex-col gap-[32px] row-start-2 items-center">
|
|
||||||
<section className="space-y-1 text-center">
|
|
||||||
<dl className="space-y-10">
|
|
||||||
<div>
|
|
||||||
<dt className="sr-only">Опубликовано</dt>
|
|
||||||
<dd className="text-base leading-6 font-medium text-gray-500 dark:text-gray-400">
|
|
||||||
Monday, December 21, 2025
|
|
||||||
</dd>
|
|
||||||
</div>
|
|
||||||
</dl>
|
|
||||||
<div>
|
|
||||||
<h1 className="text-3xl leading-9 font-extrabold tracking-tight text-gray-900 sm:text-4xl sm:leading-10 md:text-5xl md:leading-14 lg:text-3xl dark:text-gray-100">
|
|
||||||
Создание и интеграция собственного процессорного ядра на базе RISC-V с использованием языка Chisel
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</main>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
98
app/post/[slug]/page.tsx
Normal file
98
app/post/[slug]/page.tsx
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
import { getPostData, getAllPostSlugs } from '@/lib/posts';
|
||||||
|
import { notFound } from 'next/navigation';
|
||||||
|
import Link from 'next/link';
|
||||||
|
|
||||||
|
interface PostPageProps {
|
||||||
|
params: Promise<{ slug: string }>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function generateStaticParams() {
|
||||||
|
const slugs = getAllPostSlugs();
|
||||||
|
console.log('Генерация статических путей для slugs:', slugs);
|
||||||
|
|
||||||
|
return slugs.map((slug) => ({
|
||||||
|
slug,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function generateMetadata({ params }: PostPageProps) {
|
||||||
|
const { slug } = await params;
|
||||||
|
const post = await getPostData(slug);
|
||||||
|
|
||||||
|
if (!post) {
|
||||||
|
return {
|
||||||
|
title: 'Пост не найден',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: post.title,
|
||||||
|
description: post.description,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function PostPage({ params }: PostPageProps) {
|
||||||
|
const { slug } = await params;
|
||||||
|
const post = await getPostData(slug);
|
||||||
|
|
||||||
|
console.log(`Загрузка поста: ${slug}, результат:`, post ? 'найден' : 'не найден');
|
||||||
|
|
||||||
|
if (!post) {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
const formatDate = (dateStr: string) => {
|
||||||
|
try {
|
||||||
|
const date = new Date(dateStr);
|
||||||
|
return new Intl.DateTimeFormat('ru-RU', {
|
||||||
|
weekday: 'long',
|
||||||
|
year: 'numeric',
|
||||||
|
month: 'long',
|
||||||
|
day: 'numeric',
|
||||||
|
}).format(date);
|
||||||
|
} catch {
|
||||||
|
return dateStr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<main className="flex flex-col gap-[32px] row-start-2 items-center">
|
||||||
|
<section className="space-y-1 text-center max-w-4xl w-full px-4 mt-2">
|
||||||
|
<dl className="space-y-10">
|
||||||
|
<div>
|
||||||
|
<dt className="sr-only">Опубликовано</dt>
|
||||||
|
<dd className="text-base leading-6 font-medium text-gray-500 dark:text-gray-400">
|
||||||
|
{formatDate(post.date)}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
<div>
|
||||||
|
<h1 className="text-3xl leading-9 font-extrabold tracking-tight text-gray-900 sm:text-4xl sm:leading-10 md:text-5xl md:leading-14 dark:text-gray-100">
|
||||||
|
{post.title}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
{post.tags.length > 0 && (
|
||||||
|
<div className="flex flex-wrap justify-center gap-2 mt-4">
|
||||||
|
{post.tags.map((tag) => (
|
||||||
|
<Link
|
||||||
|
key={tag}
|
||||||
|
href={`/tags/${tag}`}
|
||||||
|
className="inline-block border border-slate-400 px-3 py-1 rounded-full text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
|
||||||
|
>
|
||||||
|
{tag}
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</section>
|
||||||
|
<section className="mx-auto px-4 pb-[4em] w-full px-[3em]">
|
||||||
|
<article
|
||||||
|
className="prose prose-lg dark:prose-invert prose-headings:font-bold prose-a:text-blue-500 hover:prose-a:text-blue-700 prose-code:bg-gray-100 dark:prose-code:bg-gray-800 prose-pre:bg-gray-900 dark:prose-pre:bg-gray-900 prose-img:rounded-xl prose-blockquote:border-l-4 prose-blockquote:border-blue-500 prose-blockquote:bg-gray-50 dark:prose-blockquote:bg-gray-800 prose-blockquote:italic prose-blockquote:pl-4 max-w-none"
|
||||||
|
dangerouslySetInnerHTML={{ __html: post.contentHtml }}
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
66
lib/posts.ts
Normal file
66
lib/posts.ts
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
import matter from 'gray-matter';
|
||||||
|
import { remark } from 'remark';
|
||||||
|
import html from 'remark-html';
|
||||||
|
|
||||||
|
const postsDirectory = path.join(process.cwd(), 'posts');
|
||||||
|
|
||||||
|
export interface PostData {
|
||||||
|
slug: string;
|
||||||
|
title: string;
|
||||||
|
date: string;
|
||||||
|
tags: string[];
|
||||||
|
contentHtml: string;
|
||||||
|
description: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAllPostSlugs(): string[] {
|
||||||
|
const fileNames = fs.readdirSync(postsDirectory);
|
||||||
|
return fileNames.map((fileName) => fileName.replace(/\.md$/, ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSortedPostsData(): Omit<PostData, 'contentHtml'>[] {
|
||||||
|
const fileNames = fs.readdirSync(postsDirectory);
|
||||||
|
const allPostsData = fileNames.map((fileName) => {
|
||||||
|
const slug = fileName.replace(/\.md$/, '');
|
||||||
|
const fullPath = path.join(postsDirectory, fileName);
|
||||||
|
const fileContents = fs.readFileSync(fullPath, 'utf8');
|
||||||
|
const matterResult = matter(fileContents);
|
||||||
|
|
||||||
|
return {
|
||||||
|
slug,
|
||||||
|
title: matterResult.data.title,
|
||||||
|
date: matterResult.data.date,
|
||||||
|
tags: matterResult.data.tags || [],
|
||||||
|
description: matterResult.data.description || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return allPostsData.sort((a, b) => {
|
||||||
|
if (a.date < b.date) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getPostData(slug: string): Promise<PostData> {
|
||||||
|
const fullPath = path.join(postsDirectory, `${slug}.md`);
|
||||||
|
const fileContents = fs.readFileSync(fullPath, 'utf8');
|
||||||
|
const matterResult = matter(fileContents);
|
||||||
|
const processedContent = await remark()
|
||||||
|
.use(html)
|
||||||
|
.process(matterResult.content);
|
||||||
|
const contentHtml = processedContent.toString();
|
||||||
|
|
||||||
|
return {
|
||||||
|
slug,
|
||||||
|
contentHtml,
|
||||||
|
title: matterResult.data.title,
|
||||||
|
date: matterResult.data.date,
|
||||||
|
tags: matterResult.data.tags || [],
|
||||||
|
description: matterResult.data.description || '',
|
||||||
|
};
|
||||||
|
}
|
||||||
1167
package-lock.json
generated
1167
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,10 +9,14 @@
|
|||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@tailwindcss/typography": "^0.5.19",
|
||||||
|
"gray-matter": "^4.0.3",
|
||||||
"next": "15.2.0",
|
"next": "15.2.0",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"react-icons": "^5.5.0"
|
"react-icons": "^5.5.0",
|
||||||
|
"remark": "^15.0.1",
|
||||||
|
"remark-html": "^16.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3",
|
"@eslint/eslintrc": "^3",
|
||||||
|
|||||||
11
posts/chisel.md
Normal file
11
posts/chisel.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: "Создание и интеграция собственного процессорного ядра на базе RISC-V с использованием языка Chisel"
|
||||||
|
date: "2025-12-21"
|
||||||
|
tags: ["risc-v", "chisel", "hardware"]
|
||||||
|
description: "Краткое описание"
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Заголовок статьи
|
||||||
|
|
||||||
|
Содержимое статьи в формате Markdown...
|
||||||
68
posts/riscv.md
Normal file
68
posts/riscv.md
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
title: "RISC-V: Что такое и какие варианты для работы с RISC-V в России есть"
|
||||||
|
date: "2025-12-21"
|
||||||
|
tags: ["risc-v", "hardware"]
|
||||||
|
description: "Подробно о том почему российские компании выбирают RISC-V и какие варианты для развития в данной сфере есть сейчас и что может появиться в будущем. "
|
||||||
|
---
|
||||||
|
|
||||||
|
**RISC-V** (произносится «риск-файв») — это открытая и свободная архитектура набора команд (Instruction Set Architecture, ISA) для процессоров. В отличие от закрытых архитектур x86 (Intel, AMD) или ARM, спецификации RISC-V находятся в открытом доступе, а их использование не требует выплаты лицензионных отчислений. Это не конкретный процессор, а стандарт, на основе которого любая компания или исследовательская группа может разработать собственное ядро.
|
||||||
|
|
||||||
|
В условиях современных технологических ограничений RISC-V перестал быть просто академическим проектом и превратился в стратегическую возможность для создания независимой технологической базы.
|
||||||
|
|
||||||
|
## Ключевые особенности архитектуры
|
||||||
|
|
||||||
|
* **Открытость и свобода от лицензионных отчислений**: Базовая спецификация открыта, что позволяет избежать зависимости от зарубежных вендоров.
|
||||||
|
* **Модульность**: Архитектура построена по принципу «базовый набор + расширения». Можно создать как простое встроенное ядро, так и сложный многоядерный процессор для серверов.
|
||||||
|
* **Простота и элегантность**: Современный дизайн, лишенный исторического балласта, упрощает разработку и верификацию.
|
||||||
|
* **Растущая экосистема**: Вокруг RISC-V сформировалось глобальное сообщество, развиваются инструменты (компиляторы GCC, LLVM), операционные системы (Linux, Zephyr) и средства симуляции.
|
||||||
|
|
||||||
|
## Почему RISC-V стал стратегическим выбором для России
|
||||||
|
|
||||||
|
1. **Технологическая независимость**: Архитектура предоставляет полный контроль над микроархитектурой. Это значит, что можно создавать процессоры без оглядки на экспортные ограничения и политику иностранных правообладателей.
|
||||||
|
2. **Безопасность**: Открытость спецификации позволяет проводить глубокий аудит на уровне аппаратуры, исключая недокументированные возможности (backdoors).
|
||||||
|
3. **Экономическая эффективность**: Отсутствие лицензионных платежей и возможность кастомизации под конкретную задачу (например, ускорение криптографических алгоритмов) снижают стоимость владения и ускоряют выход на рынок.
|
||||||
|
4. **Развитие компетенций**: Работа с открытой архитектурой стимулирует рост фундаментальных знаний в области проектирования процессоров, а не только их применения.
|
||||||
|
|
||||||
|
## Варианты для работы с RISC-V в России: настоящее и ближайшее будущее
|
||||||
|
|
||||||
|
### 1. Образование и развитие кадров
|
||||||
|
Освоение RISC-V начинается с обучения. Уже сегодня доступны несколько путей:
|
||||||
|
* **Вузовские программы**: Ведущие технические университеты (МФТИ, МИФИ, ИТМО, СПбПУ) постепенно включают RISC-V в учебные курсы по архитектуре компьютеров и системному программированию.
|
||||||
|
* **Онлайн-курсы и вебинары**: Российские технологические компании и энтузиасты проводят открытые лекции и практикумы по основам RISC-V.
|
||||||
|
* **Лаборатории и хакатоны**: Появляются студенческие проектные лаборатории, где можно получить практический опыт в проектировании простых ядер на ПЛИС (например, на платах SiFive или отечественных аналогах).
|
||||||
|
|
||||||
|
### 2. Промышленные разработки и коммерческие продукты
|
||||||
|
Ряд российских компаний уже делает ставку на RISC-V:
|
||||||
|
* **СКБ Контур**: Разработала серию 32-битных микроконтроллеров **K1986ВК028** на ядре RISC-V (BA25) для встраиваемых систем.
|
||||||
|
* **Yadro**: Анонсировала планы по созданию собственных процессоров на основе RISC-V для инфраструктурных решений.
|
||||||
|
* **Ростех и дочерние структуры**: Ведется исследование и разработка процессорных решений для специализированных применений (промышленная автоматизация, телеком).
|
||||||
|
* **Научные центры (КНЦ РАН, ИППМ РАН)**: Активно участвуют в исследовании и создании прототипов высокопроизводительных ядер, работают над инструментами верификации и отладки.
|
||||||
|
|
||||||
|
### 3. Проекты с открытым исходным кодом
|
||||||
|
Это фундамент для будущего развития:
|
||||||
|
* **Участие в глобальных проектах**: Российские разработчики вносят вклад в международные open-source проекты, такие как ядро Linux, компиляторы, симуляторы QEMU и эмулятор Spike.
|
||||||
|
* **Создание отечественных открытых ядер**: Разработка и публикация в открытом доступе собственных процессорных ядер (например, на языке Chisel или SystemVerilog) для образовательных и промышленных целей.
|
||||||
|
* **Развитие экосистемы ПО**: Адаптация и оптимизация операционных систем (Astra Linux, Альт), компиляторов и middleware под RISC-V-платформы.
|
||||||
|
|
||||||
|
### 4. Государственные инициативы и поддержка
|
||||||
|
* **Стратегические программы**: RISC-V упоминается в ключевых документах по развитию электронной промышленности и импортозамещению как одна из приоритетных архитектур.
|
||||||
|
* **Грантовая поддержка**: Фонды (Сколково, ФСИ) и министерства финансируют НИОКР и стартапы в области проектирования процессоров и создания инструментальной базы.
|
||||||
|
* **Стандартизация**: Ведутся работы по гармонизации отечественных требований по информационной безопасности с возможностями архитектуры RISC-V.
|
||||||
|
|
||||||
|
## Будущее RISC-V в России: перспективы и вызовы
|
||||||
|
|
||||||
|
**Сценарии развития на 5-10 лет:**
|
||||||
|
|
||||||
|
1. **Доминирование в нишевых и встраиваемых системах**: Микроконтроллеры на RISC-V станут стандартом для IoT, промышленной автоматизации, автомобильной электроники.
|
||||||
|
2. **Выход в сегмент высокопроизводительных вычислений**: Появление первых отечественных серверных и HPC-процессоров на оптимизированных многоядерных RISC-V-архитектурах.
|
||||||
|
3. **Формирование полного технологического цикла**: От проектирования и производства (с учетом развития отечественных техпроцессов) до создания законченных программно-аппаратных комплексов.
|
||||||
|
4. **Интеграция в учебные программы**: RISC-V станет основной архитектурой для обучения в российских инженерных вузах, что обеспечит постоянный приток квалифицированных кадров.
|
||||||
|
|
||||||
|
**Ключевые вызовы:**
|
||||||
|
* **Создание конкурентоспособной производственной базы** (процессоры требуют современных техпроцессов).
|
||||||
|
* **Масштабирование экосистемы**: Необходимо привлечь широкий круг разработчиков прикладного ПО.
|
||||||
|
* **Конкуренция с устоявшимися решениями**: Потребуются убедительные экономические и технологические аргументы для перехода с ARM и x86.
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
RISC-V — это не просто технологическая альтернатива, а **новая парадигма развития микроэлектроники**. Для России она представляет собой уникальный исторический шанс построить независимую, безопасную и конкурентоспособную отрасль проектирования процессоров. Успех будет зависеть от слаженных усилий государства, бизнеса, науки и образовательных учреждений. Уже сегодня каждый разработчик, студент или компания, начинающая работу с RISC-V, вносит вклад в создание фундамента для цифрового суверенитета страны. Будущее архитектуры в России выглядит многообещающе, и окно возможностей открыто как никогда.
|
||||||
Reference in New Issue
Block a user