【芯片前端】保持代码手感——编写常值乘法器和一些拓展

题目没什么意思,给的参考波形也有问题,不过可以拓展一点东西。

题目

编写一个4bit乘法器模块,并例化该乘法器求解c=12*a+5*b,其中输入信号a,b为4bit无符号数,c为输出。注意请不要直接使用*符号实现乘法功能。

module calculation(
	input clk,
	input rst_n,
	input [3:0] a,
	input [3:0] b,
	output [8:0] c
	);
endmodule

答案解析

无非就是用移位加法实现常值乘法呀,题目没讲清楚哪拍出,那我们就下一拍出值好了:

module calculation(
	input clk,
	input rst_n,
	input [3:0] a,
	input [3:0] b,
	output [8:0] c
	);

    reg [8:0]a_mul_12;
    reg [8:0]b_mul_5;

    always @(posedge clk or negedge rst_n)begin
        if(~rst_n) a_mul_12 <= 0;
        else       a_mul_12 <= (a<<3) + (a<<2);
    end
    always @(posedge clk or negedge rst_n)begin
        if(~rst_n) b_mul_5 <= 0;
        else       b_mul_5 <= (b<<2) + b;
    end
    assign c = a_mul_12 + b_mul_5;
endmodule

用auto_verifition仿一下:

 好了这个题没啥,注意一点,+优先级高于<<,因此别写成a<<3 + a<<2就行,否则逻辑出错。

延伸一下

如果我是面试官呢,我会继续延伸一步,不使用*写一下c=255*a的逻辑,当然了,这样写肯定是没有问题的:

c = (a << 7) + (a << 6) + (a << 5) + (a << 4) + (a << 3) + (a << 2) + (a << 1) + a

但是肯定有更好的逻辑优化解:

c = (a << 8) - a

要知道,减法和加法的逻辑开销是相差很小的。

你可能感兴趣的:(芯片前端设计,芯片,verilog,python)