@飞 你好,我不知道你执行 run_case 脚本的时候,有没有去看一下这个脚本具体写了些什么?如果你没看的话,建议你看一下。
关于运行 case 的原理
1、在你运行 run_case 脚本之后,会在 workdir 目录下生成对应的工程,包括 makefile、linker、启动文件、库函数等一些源码。但不是全部,具体根据 Makefile 的定义。
2、接下来通过执行 makefile 脚本,使用对应的工具链,编译生成可执行文件,包括 elf、bin等。makefile 最后还会输出 .pat 文件,即用于仿真的二进制指令。
3、启动与你配置的相对应的仿真工具进行仿真。比如 iverilog,启动 iverilog 后会读取你所有的 rtl 代码,分析编译,其中也包括把你上一步生成的 .pat 文件初始化到对应 mem (rom) 。仿真启动后会到 mem 中取指,然后一步步执行。
关于串口的配置
1、代码不仅仅只有主函数,一个芯片从启动到 main 函数之前,还有很多步骤要做。这些工作很多时候都是用汇编语言来完成的。所以你也应该注意到还有 .S 文件的存在,一般是 statup.S 文件。而 wujian 的一些系统初始化和 Broad 初始化相关的操作就是在这里面完成的,包括串口的配置。
2、虽然主函数是使用 printf 来完成字符串输出的,但是 printf 函数的底层也是有做重定向到串口了,所以使用 printf 函数就能通过串口输出相应的内容。