本题目虽然简单,但是值得探究if...else仿真时的注意点,笔试遇到过,你不一定能答对哦~

1. 题目

根据输入信号a,b的大小关系,求解两个数的差值:输入信号a、b为8bit位宽的无符号数。

如果a>b,则输出a-b;

如果a≤b,则输出b-a。

2. 解析

if..else语句即可。关注点还是和第6题一样,有符号数问题。

2.1 if...else的注意要点

if...else的注意点:

if里只能判断条件是0还是1,如果出现X或者Z,则判断不出来。

 

 答案:不一样!

(1)

对于

always @ (*)

begin

    if(a == 1'b0)

        b = 1'b0;

    else

        b = 1'b1;

end

 

当输入a是0时,b输出0,否则b输出1(否则的意思是只要不等于0!包括了x和z也是不等于0,不是只有1不等于0);

 

其他两种情况夏是一样的,if里面只能判断0和1,当出现x和z时到else里。

具体仿真图如下:

 

 

2.2等号运算符==和===的区别

有人要问了,如果直接判断if(a == 1’bx)或者if(a == 1’bz)呢?

当a = 1’bx时,if里的a==1’bx结果不为真!

这一部分又涉及到了两个等号==和三个等号===。

参考夏宇闻老师的书籍:

 

if(A==1’bx) $display(“AisX”); (当A等于X时,这个语句不执行)

if(A===1’bx) $display(“AisX”); (当A等于X时,这个语句执行)

 

注意,这部分在很多笔试题中出现过,判断条件和对应输出。

 牛客Verilog刷题解析及对应笔试面试注意点【1-5】

 

3. 代码

`timescale 1ns/1ns
module data_minus(
	input clk,
	input rst_n,
	input [7:0]a,
	input [7:0]b,

	output  reg [8:0]c
);
    
always @ (posedge clk&nbs***bsp;negedge rst_n)
begin
    if( ~rst_n ) begin
        c <= 8'b0;
    end 
    else begin
        if( a > b ) begin
            c <= a - b;
        end 
        else begin
            c <= b - a;
        end 
    end 
end    
    
endmodule

入职前空白期该如何度过?——作为应届生,我在入职前做了什么?https://www.nowcoder.com/discuss/936283?source_id=profile_create_nctrack&channel=-1