• verilog语法-008—几种可综合的for循环语句


    1、采用int实现不同信号赋值的循环

    利用for循环实现对信号的赋值。如下案例中,func_id_vld为512bit,需要根据func_mode_in[1024-1:0]给func_id_vld赋值,func_mode_in每2个bit对应一个func_id_vld,即func_mode_in[1:0]对应func_id_vld[0],func_mode_in[3:2]对应func_id_vld[1],func_mode_in[1023:1022]对应func_id_vld[511], 赋值规则为func_mode_in[1:0]为2‘b01时,func_id_vld[0]为1,以此类推。采用for(int*)类型格式,可以在一个else分支中使用,不需要使用generate,使用更加灵活,使用范围更广。

    1. input [1024-1:0] func_mode_in;
    2. reg [512-1:0] func_id_vld;
    3. always@(posedge clk)
    4. if(~rst_n) begin
    5. func_id_vld <= 512'b0 ;
    6. end else begin
    7. for(int i=0; i<512;i=i+1) begin : func_id_vld_gen
    8. func_id_vld[i] <= (func_mode_in[2*i+:2]==2'b01) ;
    9. end
    10. end

    2、采用int实现同一个信号赋值的循环

    下图所示,采用for(int*)类型格式实现了一个16mux1的循环赋值语句,实现不同条件一下,对debug_test_16mux1的赋值操作,即16mux1的逻辑。

    1. input [128*16-1:0] debug_test_in;
    2. input [4-1:0] cfg_16mux1_mode;
    3. reg [128-1:0] debug_test_16mux1;
    4. always@(*) begin
    5.     debug_test_16mux1 = 128'd0;  
    6.     for(int i=0; i<16;i=i+1) begin : debug_test_16mux1_gen
    7.         if(cfg_16mux1_mode ==i) begin
    8.             debug_test_16mux1  =  debug_test_in[128*i+:128] ;
    9.             break ;
    10.         end
    11.     end
    12. end

    如上for循环语句实现了如下的case语句效果

    1. always@(*) begin
    2. case(cfg_16mux1_mode)
    3. 0 : debug_test_16mux1 = debug_test_in[127 :0 ];
    4. 1 : debug_test_16mux1 = debug_test_in[255 :128 ];
    5. 2 : debug_test_16mux1 = debug_test_in[383 :256 ];
    6. 3 : debug_test_16mux1 = debug_test_in[511 :384 ];
    7. 4 : debug_test_16mux1 = debug_test_in[639 :512 ];
    8. 5 : debug_test_16mux1 = debug_test_in[767 :640 ];
    9. 6 : debug_test_16mux1 = debug_test_in[895 :768 ];
    10. 7 : debug_test_16mux1 = debug_test_in[1023 :896 ];
    11. 8 : debug_test_16mux1 = debug_test_in[1151 :1024 ];
    12. 9 : debug_test_16mux1 = debug_test_in[1279 :1152 ];
    13. 10: debug_test_16mux1 = debug_test_in[1407 :1280 ];
    14. 11: debug_test_16mux1 = debug_test_in[1535 :1408 ];
    15. 12: debug_test_16mux1 = debug_test_in[1663 :1536 ];
    16. 13: debug_test_16mux1 = debug_test_in[1791 :1664 ];
    17. 14: debug_test_16mux1 = debug_test_in[1919 :1792 ];
    18. 15: debug_test_16mux1 = debug_test_in ;
    19. endcase
    20. end

    NOTE:在for(int*)语句中,debug_test_16mux1  = debug_test_in[128*i+127:128*i] ; 会报语法错误,语法错误,只识别debug_test_in[128*i+:128]而无法识别debug_test_in[128*i+127:128*i] ,否则VCS会报语法错误。

  • 相关阅读:
    选择合适的帧率和分辨率:优化RTSP流视频抓取(java)
    复杂数据统计与R语言程序设计实验一
    RabbitMQ消息中间件
    机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python 计算机竞赛
    基于Socket开发吃豆人联机游戏 课程设计 大作业
    同花顺_代码解析_五彩K线
    【微信小程序】创建项目
    bihash总结
    齐次坐标与投影几何
    webdriver.Chrome()没反应
  • 原文地址:https://blog.csdn.net/icxiaoge/article/details/126691715