标签: vlsi

在Verilog中编写RAM的更好方法

编写RAM时哪个代码更好?

  1. 分配data_out内部always块:

    module memory(
        output reg [7:0] data_out,
        input [7:0] address,
        input [7:0] data_in, 
        input write_enable,
        input clk
    );
        reg [7:0] memory [0:255];
    
        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
            data_out <= memory[address];
        end
    
    endmodule
    
    Run Code Online (Sandbox Code Playgroud)
  2. data_out使用assign声明分配:

    module memory(
        output [7:0] data_out,
        input [7:0] address,
        input [7:0] data_in, 
        input write_enable,
        input clk
    );
        reg [7:0] memory [0:255];
    
        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
        end
    
        assign …
    Run Code Online (Sandbox Code Playgroud)

verilog vlsi

17
推荐指数
2
解决办法
3万
查看次数

如何在RTL中使用时钟门控?

我在我的设计中为时钟控制了一些锁存和逻辑.我在合成和布局方面没有太多经验.在RTL中实现时钟门控的正确方法是什么?

例1:

always_comb begin
    gated_clk  = clk & latch_update_en;
end

always_latch begin
    if(gated_clk) begin
         latch_data <= new_data;
    end
end
Run Code Online (Sandbox Code Playgroud)

例2:在对RTL时钟门控的良好实践进行一些研究时,我偶然发现了一个RTL示例.该示例实现了上面的代码:

clock_gator cg_cell (.clk(clk), .en(latch_update_en), .scan_en(scan_en_in), .gated_clk(gated_clk));

always_latch begin
    if(gated_clk) begin
         latch_data <= new_data;
    end
end
Run Code Online (Sandbox Code Playgroud)

使用自定义时钟门控单元的目的是什么?如果clk在带有另一个使能信号的always_comb块中直接"和"处理,那么该工具是否在合成中有困难时间?我感觉使用特殊时钟门控单元是生成门控时钟信号的标准方法.我试图理解为什么会这样.

verilog register-transfer-level system-verilog vlsi

10
推荐指数
1
解决办法
2万
查看次数

如何在Verilog中签名扩展一个数字

我正在为Verilog中的一个简单的符号扩展器开发一个我正在为计算机体系结构创建的处理器.

这是我到目前为止所做的:[编辑:略微改变选择陈述]

`timescale 1ns / 1ps

module SignExtender( CLK, extend, extended );
input[7:0] extend;
input CLK;
output[15:0] extended;

reg[15:0] extended;
wire[7:0] extend;

always
begin
    while (CLK == 1)
    extended[7:0] = extend[7:0];
    extended[15:8] = {8{extend[7]}};
end
endmodule
Run Code Online (Sandbox Code Playgroud)

我添加了while(CLK == 1)思考可以解决我的问题,我认为这是一个无限循环.当我尝试在iSim中测试时,电路永远不会初始化.

我也尝试删除复制语法,只为[8] - [15]做扩展[8] = extend [7]等,但是会出现相同的结果,所以我很确定最内层的语法是正确的.

这是测试文件:

`timescale 1ns / 1ps
module SignExtender_testbench0;

    // Inputs
    reg [7:0] extend;
    reg CLK;

    // Outputs
    wire [15:0] extended;

    // Instantiate the Unit Under Test (UUT)
    SignExtender uut (
        .extend(extend), 
        .extended(extended)
    );

    initial begin
        // …
Run Code Online (Sandbox Code Playgroud)

verilog vlsi

8
推荐指数
2
解决办法
6万
查看次数

Verilog到GDSII编译器(开源)

可能不是StackOverflow这个问题,但是编译器和Verilog(可以视为编程语言)都与此项目有关。

在哪里可以找到从Verilog语言到GDSII格式或Netlist的开源(或可下载且免费用于非商业用途)编译器?有很多Verilog模拟器(可将其编译为本地机器代码或C语言),很多Verilog-to-FPGA编译器,但我希望编译器能够从Verilog生成晶体管的几何结构。

网表是http://en.wikipedia.org/wiki/网表-集成电路元件的互连,例如晶体管,电阻器甚至是电池(?)。它可以转换为GDSII,但是如果编译器在“ Verilog-> Netlist”上运行,我还需要一个免费的转换器“ Netlist-> GDS2”。

GDSII http://en.wikipedia.org/wiki/GDSII-是VLSI集成电路(IC)的一种格式,被IC制造商所接受。一个人用硅制造GDSII几乎是不可能的,但是我认为尝试编译一些小示例可能很有趣。

该编译器可以使用“完全定制”(它将绘制所有晶体管本身),也可以使用“基于单元”的设计(将verilog编译为某些库单元的几何集)。

当然,所需的编译器可以是大学项目,而不能编译大型Verilog项目。

谢谢。

compiler-construction verilog circuit vlsi

5
推荐指数
1
解决办法
2015
查看次数

华莱士树和达达乘数之间的差异

谁能说出华莱士乘法器和达达乘法器之间的部分乘积减少方法或机制的区别?

我一直在阅读A_comparison_of_Dadda_and_Wallace_multiplier_delays.pdf

华莱士VS爸爸

fpga multiplication addition vlsi

5
推荐指数
1
解决办法
3497
查看次数

移位寄存器Verilog

我是HDL语言的新手.我有一个关于如何编程移位寄存器的问题.(我知道我转向另一个方向).为什么这本书使用wire[N-1:0] r_next?我的实施有什么缺点?谢谢

我的第一次尝试如下

module lesson04#(parameter N=8)(
    input wire clk, reset,
    input wire data,
    output wire out
);

reg [N-1: 0] r_reg;


always @(posedge clk or negedge reset)
begin
    if(!reset)
         r_reg =0;
    else 
        r_reg[0]=data;
        r_reg = r_reg<<1;
end

assign out =r_reg[N-1];
endmodule 
Run Code Online (Sandbox Code Playgroud)

但是这本书给出了:

module lesson04#(parameter N=8)(
    input wire clk, reset,
    input wire data,
    output wire out
);

reg [N-1: 0] r_reg;
wire[N-1:0] r_next;

always @(posedge clk or negedge reset)
begin
    if(!reset)
         r_reg =0;
    else 
        r_reg <= r_next;
end

assign …
Run Code Online (Sandbox Code Playgroud)

verilog vlsi

4
推荐指数
1
解决办法
2万
查看次数

如何将固定分数应用于整数

我想将修改后的分数乘以整数,如下所示

(乘以幂项乘以负项的乘法)

我已经做了什么来找到分数转换为CSD形式的方法.但我想知道如何应用乘以整数.

例如,我得到了这个

0.46194 = 2 ^ -1 - 2 ^ -5 - 2 ^ -7 + 2 ^ -10.

然后我可以像verilog rtl表达式那样:

y =(x >> 1) - (x >> 5) - (x >> 7)+(x >> 10);

但问题是,如果输入值为3,那么如何计算上面的代码呢?

y =(3 >> 1) - (3 >> 5) - (3 >> 7)+(3 >> 10);

但据我所知,它无法计算.因为3 >> 1为1,(3 >> 5)为0,(3 >> 7)为0,(3 >> 10)为0;

所以我无法得到正常的结果.找到修改的分数表达式的原因也消失了.然后这个帖子的问题点是"如何将修改后的分数应用于整数".

更新:这应该是这样的.y =((3 << 1024)>> 1) - ((3 << 1024)>> 5) - ((3 << 1024)>> 7)+((3 << …

verilog vlsi

4
推荐指数
1
解决办法
3720
查看次数

在verilog设计中产生时钟故障

我正在使用verilog设计芯片.我有一个3位计数器.我希望当计数器处于第8个循环时,应该有一个时钟故障然后正常工作.在verilog设计中可能产生时钟故障的方法是什么?

verilog clock vlsi

3
推荐指数
1
解决办法
1673
查看次数

为什么延迟不能在verilog中综合?

我一直读到 RTL 代码中声明的延迟永远无法被综合。它们仅用于模拟目的,现代综合工具只会忽略代码中的延迟声明。

例如:将被综合工具x = #10 y;视为。x = y;

有人可以解释一下为什么无法综合任何硬件描述语言(即VHDL、Verilog 或Sytem-Verilog)中的延迟声明吗?

verilog vhdl system-verilog vlsi asic

3
推荐指数
1
解决办法
2508
查看次数

用于将verilog输出写入文本文件的测试平台

我无法在文本文件中获得正确的输出,但是在modelsim中的模拟非常好..但是在将其写入文本文件时,每次输入都获得XX.可能有一些语法错误或其他一些.如果有任何可以帮助plz写下测试工作台来写一个触发器的dout(输出)(作为一个例子),每个dout(输出)显示在文本文件的新行中.

码:

module LFSR( clk,reset,out);
parameter width =4;
input clk,reset;
output [width-1:0] out ;
reg [width-1:0] lfsr;

integer r;
wire feedback = lfsr[width-1]^lfsr[width-2];


always @(posedge clk)
  if (reset)
    begin
      lfsr <= 4'b1000; 
    end
  else
    begin
      lfsr[0] <= feedback;
      for(r=1;r<width;r=r+1)
        lfsr[r]<=lfsr[r-1];
    end

  assign out=lfsr;
endmodule
Run Code Online (Sandbox Code Playgroud)

试验台:

module aaatest();

  parameter width =4;
  reg clk,reset;
  wire [width-1:0] out;
  reg [width-1:0] lfsr[13:0];
  integer f,i;

  initial
    begin
      f = $fopen("output.txt","w");
    end

    LFSR patt (clk,reset,out);

    always #5 clk=~clk;

    initial begin
      clk=1; reset=1;
      #10 reset=0;
      # 140 …
Run Code Online (Sandbox Code Playgroud)

verilog vlsi

3
推荐指数
1
解决办法
4万
查看次数