【问题标题】:Big multiplexer with for loop in VerilogVerilog中带有for循环的大型多路复用器
【发布时间】:2020-07-01 15:35:34
【问题描述】:

我希望我的电路根据传入地址将 010 和 25510 之间的值写入名为 mem_address_reg 的 reg。在与操作之后,该地址可以采用 25610 个不同值之一。我希望电路是组合的,因此检查值的一种方法是构建一个具有 25610 个不同输入的多路复用器,然后根据传入地址(选择多路复用器的行)。

这个电路可以工作,但需要我编写一个脚本来生成所有 25610 个案例语句并且代码变得臃肿。因此,我不想自己编写每一行代码,而是想使用一个 for 循环来为我生成这些代码。不幸的是,这似乎不起作用。

我做错了什么?

代码臃肿的工作电路:

wire [31:0] masked_write_adr;
reg  [29:0] nvmm_write_request_adr;
reg  [7:0]  mem_address_reg;     

assign masked_write_adr = {2'b00, nvmm_write_request_adr} & 32'hFFC0_0000;

always@(*)
begin
    case(masked_write_adr)
      32'h0000_0000:  mem_address_reg = 8'h00;
      32'h0040_0000:  mem_address_reg = 8'h01;
      32'h0080_0000:  mem_address_reg = 8'h02;
      32'h00C0_0000:  mem_address_reg = 8'h03;
      32'h0100_0000:  mem_address_reg = 8'h04;
      32'h0140_0000:  mem_address_reg = 8'h05;
      (...)
      32'h3FC0_0000:  mem_address_reg = 8'hFF;
      default:        mem_address_reg = 8'h0;
    endcase
end

这是我认为是不起作用的模拟电路:

wire [31:0] masked_write_adr;
reg  [29:0] nvmm_write_request_adr;
reg  [7:0]  mem_address_reg;     

assign masked_write_adr = {2'b00, nvmm_write_request_adr} & 32'hFFC0_0000;

integer k;
always@(*)
begin
  mem_address_reg <= 8'h00;
  for(k=0; k<255; k=k+1)
  begin
      if((k*32'h40_0000) == masked_write_adr)
        mem_address_reg <= k;
  end              
end

【问题讨论】:

  • @toolic for 循环不会推断出某种多路复用器吗?对于masked_write_adr 的每个可能值,mem_address_reg 都有一个定义的输出。也许我误解了 for 循环在 Verilog 中的工作方式;第二个解决方案在概念上如何不模拟第一个?

标签: for-loop switch-statement verilog synthesis


【解决方案1】:

只是做

assign mem_address_reg = masked_write_addr[29:22];

【讨论】:

  • 这是一个优雅的解决方案,谢谢!我不知道为什么我自己没有想出这个。您能否解释一下这两种解决方案如何推断出不同的电路设计来完全回答这个问题?
  • 我认为这只是在优化方面投入了多少精力的问题。这两种解决方案在功能上是等效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多