0
点赞
收藏
分享

微信扫一扫

verilog学习记(verilog翻译成c)



    有的时候,写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​​,可以好好学习下。

 

 

 

举报

相关推荐

0 条评论