Verilog if语句阻断z状态传播

文章详细比较了Verilog中的assign和alwaysif语句在设置输入输出时的行为,着重指出alwaysif的条件语句会阻断Z态。测试代码展示了两者在实际应用中的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、测试代码

设置两组输入输出,对比使用assign赋值语句与always if语句。

  • if_assign_test.v
`timescale 1ns / 1ps
//
// Engineer: wkk
// Module Name: if_assign_test
//
module if_assign_test(
    input  if_a_in,
    input  if_b_in,
    input  if_c_in,
    input  if_d_in,
    
    input  assign_a_in,
    input  assign_b_in,
    input  assign_c_in,
    input  assign_d_in,
    
    output reg if_a_out,
    output reg if_b_out,
    output reg if_c_out,
    output reg if_d_out,
    
    output assign_a_out,
    output assign_b_out,
    output assign_c_out,
    output assign_d_out
);

assign assign_a_out = assign_a_in ? 1'b1:1'b0;
assign assign_b_out = assign_b_in ? 1'b1:1'b0;
assign assign_c_out = assign_c_in ? 1'b1:1'b0;
assign assign_d_out = assign_d_in ? 1'b1:1'b0;

always @( * )  begin
    if( if_a_in ) begin
        if_a_out = 1'b1;
    end else begin
        if_a_out = 1'b0;
    end
end

always @( * )  begin
    if( if_b_in ) begin
        if_b_out = 1'b1;
    end else begin
        if_b_out = 1'b0;
    end
end

always @( * )  begin
    if( if_c_in ) begin
        if_c_out = 1'b1;
    end else begin
        if_c_out = 1'b0;
    end
end

always @( * )  begin
    if( if_d_in ) begin
        if_d_out = 1'b1;
    end else begin
        if_d_out = 1'b0;
    end
end

endmodule
  • tb_if_assign_test.v
`timescale 1ns / 1ps
//
// Engineer: wkk
// Create Date: 2023/12/05 20:37:07
// Module Name: tb_if_assign_test
//

module tb_if_assign_test();
reg  if_a_in;
reg  if_b_in;
reg  if_c_in;
reg  if_d_in;
reg  assign_a_in;
reg  assign_b_in;
reg  assign_c_in;
reg  assign_d_in;

wire if_a_out;
wire if_b_out;
wire if_c_out;
wire if_d_out;

wire assign_a_out;
wire assign_b_out;
wire assign_c_out;
wire assign_d_out;

if_assign_test if_assign_test_inst (
    .if_a_in (if_a_in),
    .if_b_in (if_b_in),
    .if_c_in (if_c_in),
    .if_d_in (if_d_in),
    
    .assign_a_in(assign_a_in),
    .assign_b_in(assign_b_in),
    .assign_c_in(assign_c_in),
    .assign_d_in(assign_d_in),
    
    .if_a_out   (if_a_out),
    .if_b_out   (if_b_out),
    .if_c_out   (if_c_out),
    .if_d_out   (if_d_out),
    
    .assign_a_out(assign_a_out),
    .assign_b_out(assign_b_out),
    .assign_c_out(assign_c_out),
    .assign_d_out(assign_d_out)
);

initial  begin
    if_a_in = 1'b1;
    if_b_in = 1'b0;
    if_c_in = 1'bz;
    if_d_in = 1'bx;
    
    assign_a_in = 1'b1;
    assign_b_in = 1'b0;
    assign_c_in = 1'bz;
    assign_d_in = 1'bx;
    
    # 100;
    $finish;
end
endmodule

二、仿真结果

在这里插入图片描述
通过if ( 条件 ) 的方式,z态被阻断了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值