数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (八)使用generate…for语句简化代码
数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (八)使用generate…for语句简化代码
🔈声明:
😃博主主页:王_嘻嘻的CSDN博客
🧨未经作者允许,禁止转载
🔑系列专栏:牛客Verilog习题集
🚩推荐一个IC、FPGA新手入门的好网站:👉快 点 击 进 入 学 习 吧
继续整理牛客网经典Verilog习题讲解,牛客网里除了最新的Verilog题库还有其它领域的经典笔试、面试题,大家快和我一起刷起来吧 点 击 跳 转
题目
在某个module中包含了很多相似的连续赋值语句,请使用generata…for语句编写代码,替代该语句,要求不能改变原module的功能。
module template_module(
input [7:0] data_in,
output [7:0] data_out
);
assign data_out [0] = data_in [7];
assign data_out [1] = data_in [6];
assign data_out [2] = data_in [5];
assign data_out [3] = data_in [4];
assign data_out [4] = data_in [3];
assign data_out [5] = data_in [2];
assign data_out [6] = data_in [1];
assign data_out [7] = data_in [0];
endmodule
分析:
本题主要是考察Verilog中如何使用循环来简化代码。在Verilog中循环的使用会比软件语言稍稍麻烦一些,需要额外有一个generate——endgenerate的语句块,所有的for循环需要写在块内,generate内的循环变量需要用genvar额外声明。
generate的功能其实就是复制,将同样的电路复制多份,不论是always块或者assign组合逻辑,都可以在generate中。
此外,在每个for循环后最好使用begin:loop_name(自定义),给循环取一个名字,避免后期lint报错的问题。
题解:
`timescale 1ns/1ns
module gen_for_module(
input [7:0] data_in,
output [7:0] data_out
);
generate
genvar i;
for(i=0;i<8;i=i+1)begin: loop
assign data_out[i] = data_in[7-i];
end
endgenerate
endmodule