.18可以跑200M(用的2000年出的RTL编译器,如果用现在的synopsys cadence的工具,可能频率还可以提升些),带tlb的。某指令集兼容,暂时缺少cache估计RTL要2个月后出来。
花了2个星期时间终于弄明白了gcc as ld 相关的东西,知道
main函数是怎么被调用的,入口是怎么设置的,然后自己写了 处理器的初始化汇编,初始化的堆栈指针,再跳转到main函数,程序就可以跑了。
然后写了个makefile,makefile做了如下工作:
自动编译程序,链接,objdump文件,然后调用tcl把里面的汇编指令机器码提取出来,生成.hex文件,在modelsim仿真时,verilog文件中的 altera 存储器模型调用该.hex文件,同时还要生成一个 verilog $readmemh 能够识别的 .dat文件
然后运行modelsim的,就可以看见结果了。 只是写来个 memcpy函数 和1+2..+n的函数,然后main函数调用这2个函数,把求和结果输出到memoy的特定位置,虽然简单,但是也证明流程是没有问题的了,
现在的问题是这个处理器在仿真的时候只是挂了个4096字节的存储器,然后写要扣除自己定义的1024字节的堆栈,可以编译的程序空间就只有 3K字节了,并且堆栈大小和运行的程序有关,还要写个可以分析elf文件的程序,推算堆栈大小,然后二次编译,让4096字节能够存放更多的程序内容。
贴个测试程序:
/*
extern void *memcpy(void *__to, __const__ void *__from, unsigned int __n);
*/
#include "sb_lib/lib.h"
int sum (int a[10]) {
int i,d;
d=0;
for (i=0;i<10;i++)
d="d"+a;
return (d*10);
}
int main() {
int j,i[10]={1,2,3,4,5,6,7,8,9,0};
j=sizeof(int);
* (int *)0x20000000=sum(i)+j;
return (* (int *)0x20000000);
}
文章评论(0条评论)
登录后参与讨论