Verilog for 循环

语法
for(<initial_condition>;<condition>;<step_assignment>)
begin
	//statements 
end

执行过程如下:

  1. 指定初始循环变量值
  2. 条件是否为真,条件为假则跳出循环
  3. 若条件为真则执行控制语句
  4. 循环变量迭代更新
示例#1:基本循环控制
module my_design;
	integer i;
	
	initial begin
		// Note that ++ operator does not exist in Verilog !
		for (i = 0; i < 10; i = i + 1) begin
			$display ("Current loop#%0d ", i);
		end
	end
endmodule

运行结果:

ncsim> run
Current loop#0 
Current loop#1 
Current loop#2 
Current loop#3 
Current loop#4 
Current loop#5 
Current loop#6 
Current loop#7 
Current loop#8 
Current loop#9 
ncsim: *W,RNQUIE: Simulation is complete.
示例#2:8位左移移位寄存器的实现

不使用for循环的实现:

module lshift_reg (
    input clk,            // Clock input
    input rstn,           // Active low reset input
    input [7:0] load_val, // Load value
    input load_en,        // Load enable
    
    output reg [7:0] op   // Output register value
);

// At posedge of clock, if reset is low set output to 0
// If reset is high, load new value to op if load_en=1
// If reset is high, and load_en=0 shift register to left
always @ (posedge clk) begin
    if (!rstn) begin
        op <= 0;
    end
    else begin
        if (load_en) begin
            op <= load_val;
        end
        else begin
            op[0] <= op[7];
            op[1] <= op[0];
            op[2] <= op[1];
            op[3] <= op[2];
            op[4] <= op[3];
            op[5] <= op[4];
            op[6] <= op[5];
            op[7] <= op[6];
        end
    end
end
endmodule

使用for循环实现:

module lshift_reg (
    input clk,           // Clock input
    input rstn,          // Active low reset input
    input [7:0] load_val,// Load value
    input load_en,       // Load enable
    
    output reg [7:0] op  // Output register value
);     

integer i;

// At posedge of clock, if reset is low set output to 0
// If reset is high, load new value to op if load_en=1
// If reset is high, and load_en=0 shift register to left
always @ (posedge clk) begin
    if (!rstn) begin
        op <= 0;
    end
    else begin
        // If load_en is 1, load the value to op
        // else keep shifting for every clock
        if (load_en) begin
            op <= load_val;
        end
        else begin
            for (i = 0; i < 8; i = i + 1) begin
                op[i+1] <= op[i];
            end
            op[0] <= op[7];
        end
    end
end
endmodule

可以看出使用for循环可以大大减少代码量,而且可以方便的扩展到不同位宽的数据,如果把位宽改成parameter类型则更加方便,只需要在使用时指定其宽度即可。

测试代码:

module tb;

reg clk;
reg rstn;
reg [7:0] load_val;
reg load_en;
wire [7:0] op;

// Setup DUT clock
always #10 clk = ~clk;

// Instantiate the design
lshift_reg u0 (
    .clk(clk),
    .rstn (rstn),
    .load_val (load_val),
    .load_en (load_en),
    
    .op (op)
);

initial begin
    // 1. Initialize testbench variables
    clk <= 0;
    rstn <= 0;
    load_val <= 8'h01;
    load_en <= 0;

    // 2. Apply reset to the design
    repeat (2) @ (posedge clk);
    rstn <= 1;
    repeat (5) @ (posedge clk);

    // 3. Set load_en for 1 clk so that load_val is loaded
    load_en <= 1;
    repeat(1) @ (posedge clk);
    load_en <= 0;

    // 4. Let design run for 20 clocks and then finish
    repeat (20) @ (posedge clk);
    $finish;
end
endmodule

仿真结果:
在这里插入图片描述
RTL电路:

schematic

FROM:verilog-for-loop

  • 15
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Verilog中,for循环是一种可以被综合成电路的循环结构。它的一般形式是for(variable = start_value; continue_condition; circle_express) begin operations... end。其中,variable是一个变量名,start_value是变量的初始值,continue_condition是循环的继续条件,circle_express是每个循环的步进操作,operations是每次循环的操作。\[1\] 然而,需要注意的是,在Verilog中,for循环一般不在可综合代码中使用,因为它会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,造成巨大的资源浪费。因此,for循环的使用会导致占用面积增大,综合速度变慢。\[3\] 在Verilog中,for循环的一般使用情况是在testbench中使用,用于生成激励信号。例如,在测试RS232接口时,可以使用for循环来产生测试激励的数据。\[3\] 总结起来,Verilog中的for循环是一种可以被综合成电路的循环结构,但由于资源浪费的原因,一般不在可综合代码中使用,而更多地用于testbench中生成激励信号。 #### 引用[.reference_title] - *1* *2* [17,verilog之for循环](https://blog.csdn.net/fpga_start/article/details/122588375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [FPGA verilog for循环](https://blog.csdn.net/weixin_49054039/article/details/126437027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whik1194

如果对你有帮助,欢迎打赏。谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值