verilog - 如何使用 don't cares 参数化 case 语句?

标签 verilog system-verilog

我有一条名为 input 的电线,我想检测前导的数量 我正在尝试创建一个模块,该模块使用下面的 case 语句根据前导零的数量更改输出数据。然而,输入的大小是可参数化的。

如果 X 是固定值 4,我将只创建一个 case 语句,

case (input)
  4'b0001  : o_data = {i_data[0]};
  4'b001x  : o_data = {i_data[1],1'b0};
  4'b01xx  : o_data = {i_data[2],2'b0};
  4'b1xxx  : o_data = {i_data[3],3'b0};
  default  : o_data = 4'b0000;
endcase

但是对于变量 X,我如何定义所有情况?

这个问题与这个问题类似:How to define a parameterized multiplexer using SystemVerilog

最佳答案

您无法真正参数化这样的 case 语句,但您可以使用 for 循环来代替:

module lead_detector #(parameter int WIDTH = 4) (
  input logic[WIDTH - 1:0] in,
  output logic[WIDTH - 1:0] out
);
  always_comb begin
    out = '0;
    for (int i = WIDTH - 1; i >= 0; i--)
      if (in[i] == 1'b1) begin
        out[i] = 1;
        break;
      end
  end
endmodule

这是我看到我的设计师一直在编写的代码(尽管是用 VHDL 编写的),但它应该是可综合的。

关于verilog - 如何使用 don't cares 参数化 case 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29313913/

相关文章:

verilog - System Verilog 的缩进/ pretty-print 实用程序

system-verilog - 是否可以将压缩结构与 DPI 一起使用

system-verilog - 系统 verilog 断言 : Using a reg value in a repition operator

verilog - verilog 中的除法

verilog - 警告 :Instantiation depth might indicate recursion in ModelSim

vhdl - 为什么延迟不能在verilog中合成?

system-verilog - 在 Specman E 中实现 System verilog 的 $value$plusargs() 系统函数

testing - Verilog d触发器电路测试

verilog - `timescale 是预处理器指令吗?

system-verilog - UVM_Sequencer 运行阶段内的抓取事务