有的时候,写verilog代码时,不太确定是否正确,会写一段伪c代码来进行验证,比如
module sum(input clk, input rst,output [15:0] cnt);
reg[15:0] data;
always @(posedge clk or negedge rst)
if(!rst)
data <= 16'h0000;
else if(data == 16'hffff)
data <= 16'h0000;
else
data <= data+ 1;
assign cnt=data;
endmodule
上面的代码是很简单的一段计数器代码,我们可以用c来进行验证,
void sum(int clk, int rst, int& data)
{
static int cnt = 0;
if(rst)
{
cnt = 0;
return;
}
if(clk)
{
if(cnt == 0xffff)
{
cnt = 0;
}
else
{
cnt = cnt + 1;
}
}
else
{
data = cnt;
}
}
int main()
{
static int cnt = 0;
sum(0,1, cnt); // 复位
while(1)
{
sum(0, 0, cnt); // 组合逻辑
sum(1, 0, cnt); //时序逻辑
}
}
验证的方法可能不是很智能,也有一些约束条件,比如模块之间的连线尽量用wire。但是不失为一种仿真和验证的手段,虽然比较笨拙。目前来看,c翻译为verilog是大趋势,多用于算法的加速;verilog翻译为c较少,一般用于测试居多。但是如果在项目开始的时候就有这样的测试代码,不失为一种验证的方法和手段,效率和灵活性方面也比较可靠。如果是cpu而言,仿真器配合模拟器,其测试的效果可以提高数倍,乃至数十倍,大多数的开发和调试,甚至可以用printf来完成。
ps1:
如果module里面都是wire计算,并且module的wire之间有依赖关系,那么需要好好理清一下,这是本方法需要注意的一个地方。
ps2:
B站上面,有一些开发板厂家出的fpga教程,确实不错,比如https://www.bilibili.com/video/BV1UX4y1T7dt,可以好好学习下。