OpenRisc-2-C to Verilog

2023-10-07 09:58
文章标签 verilog openrisc

本文主要是介绍OpenRisc-2-C to Verilog,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

如何将C语言代码转换成verilog HDL或者VHDL呢?
 

2.1 在线转换:

http://c-to-verilog.com/online.html

C-to-Verilog.com是海法(Haifa)大学高层次综合领域的一个学术研究而产生的一个网站。
这个网站所用的编译器是SystemRacer综合系统的一个修改版本。这个编译器的源码可用于研究目的,并且已经发给了很多编译器的研究组织。
此外还有一些文章可供参考,这些文章介绍了这个综合器的实现原理。

 

2.2 下载源码,然后安装,再使用。

 

源码,我已经上传,GPL3许可;还有介绍这个综合器实现原理的文章,文章我也已经上传(这些文章都是发表在顶级期刊或会议的优秀paper,需要付费才能下载的),和源码放在一起:

http://download.csdn.net/detail/rill_zhen/4797683

 

2.3 注意

需要LLVM 2.5的支持。LLVM是构架编译器(compiler)的框架系统,
以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),
对开发者保持开放,并兼容已有脚本。
LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展。
2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。
Apple也是LLVM计划的主要资助者。

 

2.4 测试:

先贴一个截屏吧:

 

C代码:

void rill_main(void) 
{ 
int i = 0;
int j = 0;for (int i=0; i<2; i++) j = i; 
}


点击“综合”,生成verilogHDL代码:包含模块代码和testbench代码,呵呵,连测试代码都自动生成了,想的真周到。

verilog 模块代码:

/*       This module was generated by c-to-verilog.com* THIS SOFTWARE IS PROVIDED BY www.c-to-verilog.com ''AS IS'' AND ANY* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE* DISCLAIMED. IN NO EVENT SHALL c-to-verilog.com BE LIABLE FOR ANY* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES)* * Found a bug? email info@c-to-verilog.com */module rill_main  (clk, reset, rdy,// control return_value); // params input wire clk;input wire reset;output rdy;reg rdy;output return_value;reg return_value;// Number of states:1reg [0:0] eip;parameter entry0 = 1'd0;// Assign part (0)always @(posedge clk)beginif (reset)begin$display("@hard reset");eip<=0;rdy<=0;end// Datapath // Control 
case (eip)
entry0:
beginrdy <= 1;return_value <= 0;$finish();
endendcase //eip
end //always @(..)endmodule// -- Library components --  module mul (clk, a, b, p);
output reg [31:0] p;
input [31:0] a;
input [31:0] b;
input clk;reg [31:0] t0;
reg [31:0] t1;
reg [31:0] t2;
reg [31:0] t3;
always @(posedge clk)begin
t0 <= a * b;
t1 <= t0;
t2 <= t1;
t3 <= t2;
p <=t3;
end
endmodulemodule div (clk, a, b, p);
output reg [31:0] p;
input [31:0] a;
input [31:0] b;
input clk;reg [31:0] t0;
reg [31:0] t1;
reg [31:0] t2;
reg [31:0] t3;
always @(posedge clk)begin
t0 <= a / b;
t1 <= t0;
t2 <= t1;
t3 <= t2;
p <=t3;
end
endmodulemodule shl (clk, a, b, p);
output reg [31:0] p;
input [31:0] a;
input [31:0] b;
input clk;reg [31:0] t0;
reg [31:0] t1;
reg [31:0] t2;
reg [31:0] t3;
always @(posedge clk)begin
t0 <= a << b;
t1 <= t0;
t2 <= t1;
t3 <= t2;
p <=t3;
end
endmodule// Dual port memory block
module xram (out0, din0, addr0, we0, clk0,out1, din1, addr1, we1, clk1);parameter ADDRESS_WIDTH = 16;parameter WORD_WIDTH = 32;output [WORD_WIDTH-1:0] out0;input [WORD_WIDTH-1:0] din0;input [ADDRESS_WIDTH-1:0] addr0;input we0;input clk0;output [WORD_WIDTH-1:0] out1;input [WORD_WIDTH-1:0] din1;input [ADDRESS_WIDTH-1:0] addr1;input we1;input clk1;reg [WORD_WIDTH-1:0] mem[1<<ADDRESS_WIDTH-1:0];integer i;initial beginfor (i = 0; i < (1<<(ADDRESS_WIDTH-1)); i = i + 1) beginmem[i] <= i;endendassign out0 = mem[addr0];assign out1 = mem[addr1];always @(posedge clk0)beginif (we0) beginmem[addr0] = din0;$display($time,"w mem[%d] == %d; in=%d",addr0, mem[addr0],din0);endendalways @(posedge clk1)beginif (we1) beginmem[addr1] = din1;$display($time,"w mem[%d] == %d; in=%d",addr0, mem[addr0],din0);end end
endmodule


 

此外还会生成testbench代码(和上面的代码在同一个文件中):

 // Test Bench module rill_main_test;wire rdy;reg reset, clk;always #5 clk = ~clk;wire return_value;
rill_main instance1 (clk, reset, rdy,// control return_value); // params 
initial beginclk = 0;$monitor("return = %b, 0x%x", rdy,  return_value);// Configure the values below to test the module#5 reset = 1; #5 reset = 0;
endendmodule //main_test


 

2.5 C to VHDL

此外还可以将C代码转换成VHDL,请参考:

http://tce.cs.tut.fi/

简介:

TCE is a toolset for designing application-specific processors (ASP) based on    the Transport triggered architecture (TTA). The toolset provides a complete    co-design flow from C programs down to synthesizable VHDL and parallel program    binaries. Processor customization points include the register files, function    units, supported operations, and the interconnection network.

    TCE has been developed internally in the Tampere University of Technology    since the early 2003. The current source code base consists of roughly 400 000    lines of C++ code.

 

 

这篇关于OpenRisc-2-C to Verilog的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/157573

相关文章

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

systemverilog、verilog的部分常用内部函数

1. $ceil 作用:将给定的实数或浮点数向上取整。示例:$ceil(3.2) 返回 4。 2. $floor 作用:将给定的实数或浮点数向下取整。示例:$floor(3.9) 返回 3。 3. $value$plusargs 作用:从命令行读取传递给仿真器的参数。格式:$value$plusargs("格式", 变量),格式 用来匹配命令行的参数,变量 是用来存储匹配到的值。示例:$

Verilog语法+:和-:有什么用?

Verilog语法+:和-:主要用于位选择,可以让代码更简洁。 一、位选择基础 在Verilog中,位选择可以通过直接索引来实现,例如: reg [7:0] data; wire select_a; wire [2:0] select_b;   assign select_a = data[3]; assign select_b = data[2:0]; 二、+: 和 -: 语法

Verilog和Matlab实现RGB888互转YUV444

文章目录 一、色彩空间1.1 RGB色彩空间1.2 CMYK色彩空间1.3 YUV色彩空间 二、色彩空间转换公式2.1 RGB转CMYK2.2 CMYK转RGB2.3 RGB888转YUV4442.4 YUV444转RGB888 三、MATLAB实现RGB888转YUV4443.1 matlab代码3.2 matlab结果 四、Verilog实现RGB888转YUV444 一、

FPGA第 10 篇,Verilog 中的运算符和分支语句

前言 我们都知道 Verilog 作为一种硬件描述语言,不仅用于设计和仿真数字电路,还为开发者提供了强大的工具,用于控制和优化硬件的行为。其中运算符和分支语句是 Verilog 中的两大核心组成部分,它们负责执行逻辑操作、数学运算以及决定逻辑流的控制。 运算符 在 Verilog 中用于进行各种计算和逻辑操作,它们类似于软件编程中的运算符,但特定于硬件操作,涵盖了算术、逻辑、按位操作、移位操

verilog仿真激励

简介         本章节主要描述verilog激励仿真函数的介绍。 initial         主要针对寄存器初始化值,基本所有仿真都会使用到该语句,使用如下: initial beginsys_clk = 'd0; sys_rst_n = 'd0; #2000;sys_rst_n = 'd1; end repeat         重复有限次数地执行一段代码,使用如下:

verilog语法错误

1.写敏感列表always(@posedge or @negedge ext_rst_n),语法检查报错ERROR:HDLCompiler:806 - "E:\ISE14.6\Project\sp6\sp6ex1\source_code\sp6.v" Line 27: Syntax error near "(".仔细检查应为always @(posedge ext_clk_25m or neged

在使用VScode自动生成verilog testbench文件时,提示No module named 'chardet'

https://www.cnblogs.com/whylinux/p/9839162.html 解决方法为: pip install certifi pip install chardet pip install idna pip install urllib3

FPGA第 8 篇,硬件描述语言Verilog HDL,初识Verilog HDL

前言         我们都知道 FPGA 是一种高度可编程的集成电路,适用于实现各种数字逻辑功能,而 Verilog HDL是一种广泛使用的硬件描述语言(Hardware Description Language, HDL),主要用于数字电子系统的描述、仿真和综合,以及其他数字系统的逻辑设计。通过使用 Verilog,工程师可以高效地设计和验证 FPGA 电路,从而实现所需的数字系统功能。

Verilog刷题笔记62

题目: Exams/review2015 fancytimer This is the fifth component in a series of five exercises that builds a complex counter out of several smaller circuits. You may wish to do the four previous exercises