常见verilog与电路的匹配

发布时间 2023-12-26 16:18:37作者: DOVI666

1、D触发器

module rtl(
    input clk,
    input rst_n,
    input d,
    output reg q
);
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            q <= 'b0;
        else
            q <= d;
    end
endmodule

 2、if else 选择

module rtl(
    input clk,
    input rst_n,
    input d1,d2,a,b,c,
    output reg q
);
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            q <= 'b0;
        else if(a&&b)begin
            if(c)
                q <= d1;
            else
                q <= d2;
        end
    end
endmodule

          可能综合为这种  >>>>>>>>>>

3、else if 与 case

module rtl(
    input clk,
    input rst_n,
    input a,b,c,d1,d2,d3,d4,
    output reg q
);
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            q <= 'b0;
        else if(a)
            q <= d1;
        else if(b)
            q <= d2;
        else if(c)
            q <= d3;
        else
            q <= d4;
    end
endmodule

module rtl(
    input rst_n,
    input clk,
    input [1:0]a,
    input d1,d2,d3,d4,
    output reg q
);
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            q <= 'b0;
        else begin
            case(a)
                'd1:       q <= d1;
                'd2:       q <= d2;
                'd3:       q <= d3;
                default:   q <= d4;
            endcase
        end
    end
endmodule

module rtl(
    input rst_n,
    input clk,
    input [1:0]a,
    input d1,d2,d3,d4,
    output reg q
);
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            q <= 'b0;
        else if(a==1)
            q <= d1;
        else if(a==2)
            q <= d2;
        else if(a==3)
            q <= d3;
        else 
            q <= d4;
        end
endmodule

这种写法和上面的case综合出来的RTL电路相比,有优先级区别

  注意:

  以上电路视图为RTLviewer  。在完成综合后,还有一个可观察在FPGA中的实际连线情况视图:Technology Map Viewer

TechnologyMapViewer --技术映射查看器

  1、QUARTUS II 中往往要查看RTL Viewer,其实RTLview是编译后的结果,显示的图形都是调用标准单元的结果,这是和思维有关联的显示结果,跟工艺库,FPGA类型,都没有关系;

  2、Technology Map Viewer是已经映射到FPGA器件的,是在FPGA中的实际连线情况。

  3、如果你只是想看下代码的RTL结构师什么样的,就看RTL view,如果想看映射到FPGA板子上是什么结构,就看Technology Map Viewer。

  4、RTL Viewer反映的是模块之间的连接。

  5、Technology Map Viewer可以直接看到FPGA内部门电路的连接。

  以下图示为两种代码的Technology Map Viewer图:

       以a=2'b00(即a为0)时分析,输出端q最终选择d4输出

 

 可以看到,他们两者一致。

  :if-else和case都是有优先级的,其中case可以通过synthesis parallel_case综合约束命令取消优先级;eg:case(sel)  // synthesis parallel_case

  在组合逻辑中若分支没写全则都会综合出锁存器,其中case可以通过synthesis full_case综合约束命令或default来避免,而if-else必须补全才可以避免。

在FPGA开发时,在RTL view中看到if-else具有明显优先级而case却是并行的,所以很多人便认为case是并行的,if-else才是具有优先级的,其实这个结论是错的。这是因为RTLview显示的是编译后的结果,显示的图形都是调用标准单元,跟工艺库、FPGA 类型都没有关系。更准确的应该看 TechnologyMap view,此时显示的是已经编译并映射到对应的 FPGA 器件中,是布局布线后的结果。由于现在的综合工具比之前的强大很多,所以会自动进行优化,即使你用if-else写出带有优先级的电路,综合工具在分析后认为并行更合理也会综合成并行的电路,因此这两种语法在强大的综合工具面前只是2种不同的表达方式,综合结果很可能是一样的,就看你更喜欢使用哪种描述方式。